正则表达式提取sql where子句

时间:2009-09-10 13:53:47

标签: c# regex

我使用C#创建一个正则表达式来提取sql表达式的where子句。 whre子句可以有多个具有不同运算符的列。虽然在sql中不允许分组,例如

col1 = 5 and (col3 = 6 or col4 < 5)

sql中只允许使用简单格式:

col1 = 5 and col1 < 6 or col3 <> ?

我一直在尝试使用以下内容,但“和”和“或”关键字似乎被捕获,并且它不会捕获所有:

.*?(?<columnname>.+?)(?<operator>=|<|>|<>)(?<value>.+?)\s

3 个答案:

答案 0 :(得分:2)

你确定你不希望a complete parser能节省你很多时间(即其他人投入的时间)吗?

答案 1 :(得分:1)

分解你的正则表达式,看看为什么它不起作用。

.*?(?<columnname>.+?)(?<operator>=|<|>|<>)(?<value>.+?)\s
  • .*? - 0个或更多字符,非贪婪。
  • (?<columnname>.+?) - 一个或多个字符,可以是任何非贪婪的字符,捕获到columnname
  • (?<operator>=|<|>|<>) - =<><>中的一个,捕获到columnname
  • (?<value>.+?) - 一个或多个字符,可以是任何字符,非贪婪,捕获到value
  • \s - 必须与此处的空白字符匹配

此处的唯一限制是您希望在operator中找到的内容以及字符串末尾的单个空格。您是将整个查询提供给正则表达式,还是仅将您提供的字符串作为示例?

如果您将此与您提供的示例字符串匹配

col1 = 5 and col1 < 6 or col3 <> ?

您会在columnname中找到一个空格,然后在operator中有一个等号,然后是5中的另一个空格和数字value

根据需要使这项工作有问题,因为您的标识符中可能包含空格。像这样的可能会工作:

.*?(?<columnname>`.+?`|\S+)\s*(?<operator>=|<|>|<>)\s*(?<value>`.+?`|\S+)

我在这里做的唯一更改是列名和值必须是所有非空格,或者它们必须是由反引号包围的值。此外,捕获之间还有可选的空格,而不是最后的必需空格。

您可以考虑共享您的C#,以便我们可以看到您如何针对字符串调用正则表达式,因为正则表达式只匹配一个列/运算符/值集。

答案 2 :(得分:0)

我在这里遗漏了什么吗? “提取sql表达式的where子句”为什么不简单地捕获where关键字与group by或end之间的内容:

其中(*?)(组| \ Z)