我使用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
答案 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)