C# 用于提取sql where子句的正则表达式

C# 用于提取sql where子句的正则表达式,c#,regex,C#,Regex,我正在使用C#生成一个正则表达式,以提取sql表达式的where子句。whre子句可以有多个具有不同运算符的列。虽然sql中不允许分组,例如 col1 = 5 and (col3 = 6 or col4 < 5) col1=5和(col3=6或col4

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

col1 = 5 and (col3 = 6 or col4 < 5)
col1=5和(col3=6或col4<5)
sql中只允许使用简单格式:

col1 = 5 and col1 < 6 or col3 <> ?
col1=5,col1<6还是col3?
我一直在尝试使用以下内容,但“and”和“or”关键字似乎被捕获,并且无法捕获所有内容:

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

你确定你不想这样做会节省你很多时间(即其他人投入的时间)?

你确定你不想这样做会节省你很多时间(即其他人投入的时间)?

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


我在哪里(.*)(组|\Z)

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


where(.*)(group |\Z)

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

.*?(?<columnname>.+?)(?<operator>=|<|>|<>)(?<value>.+?)\s
您会发现在
columnname
中有一个空格,然后在
操作符中有一个等号,然后在
值中有另一个空格和数字
5

让这项工作如您所愿是有问题的,因为您的标识符中可能有空格。类似的方法可能会奏效:

*?(?`.+?`|\S+)\S*(?=||)\S*(?`.+?`|\S+)
我在这里所做的唯一更改是columnname和value必须全部为非空白,或者必须是由反勾号包围的值。此外,捕获之间还有可选的空格,而不是结尾处的必填空格


你也可以考虑共享你的C语言,这样我们就可以看到你是如何调用字符串的正则表达式,因为ReGEX只匹配一个列/操作符/值集。

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

.*?(?<columnname>.+?)(?<operator>=|<|>|<>)(?<value>.+?)\s
您会发现在
columnname
中有一个空格,然后在
操作符中有一个等号,然后在
值中有另一个空格和数字
5

让这项工作如您所愿是有问题的,因为您的标识符中可能有空格。类似的方法可能会奏效:

*?(?`.+?`|\S+)\S*(?=||)\S*(?`.+?`|\S+)
我在这里所做的唯一更改是columnname和value必须全部为非空白,或者必须是由反勾号包围的值。此外,捕获之间还有可选的空格,而不是结尾处的必填空格


你也可以考虑共享你的C语言,这样我们就可以看到你是如何调用字符串的正则表达式,因为给定的正则表达式只匹配一个列/操作符/值集。

可能也会在其中添加顺序,因为(i)(组x阶z)因为IM为一个特定的源系统(NavISE)做了一般的解决方案。源列被翻译成其他语言或重命名,因此几乎没有两个源是相同的。我需要能够用我知道适合特定解决方案的列名替换列名,可能也应该在其中添加顺序,其中(.?)(group | order | \Z),因为我正在为特定源系统(Navision)制定通用解决方案,并且源列被翻译成其他语言或重命名,因此几乎没有两个源是相同的。我需要能够将列名替换为适合特定解决方案的列名
.*?(?<columnname>`.+?`|\S+)\s*(?<operator>=|<|>|<>)\s*(?<value>`.+?`|\S+)