首页 > 解决方案 > 使用正则表达式从使用 .Net 的 SQL 语句中提取特定的选择子句

问题描述

我试图想出一个正则表达式来返回 sql 语句的一部分。一个例子:

a.column1,
(select b.column1, 
b.column2, etc) as column2,
a.column3
(select c.column1, etc) as column4,
(select d.column1, 
d.column2, 
d.column3, etc) as column5,
a.column6,
(select e.column1, etc) as column7

我想要的字符串如“column5”返回生成column5“select d.column1”等的select语句。我尝试了以下内容:

\(((?:.|\n)*?)\)(?=\s{1,}AS\scolumn5)

但它将选择语句从第 2 列一直返回到第 5 列。反正有没有让我的正则表达式语句变得懒惰并且只在“column5”之前返回select语句?

标签: .netregex

解决方案


您可以使用以下正则表达式:

@"^(?<select>\(select[^)]*\))\sas\scolumn5,?$"

您应该设置'MultiLine''IgnoreCase'选项。

正则表达式从行首开始,然后创建一个命名的捕获组 ( 'select'),该组最终将仅包含“选择”语句(在括号之间)。

然后它匹配左括号 ' (' 后跟文本'select',然后是任意数量的non-right-parenthes,然后是空格、'as'、空格和文本'column5',最后是可选的逗号 ' ,' 和行尾。

如何使用

像这样创建你的正则表达式:

new Regex(@"^(?<select>\(select[^)]*\))\sas\scolumn5,?$", RegexOptions.IgnoreCase | RegexOptions.Multiline);

您可以使用以下方式访问'select'群组:Match["select"].Value;


推荐阅读