我想在SQL语句中匹配IN运算符的表达式。首先,我使用
(?sUi)\s+in\s*\((.+)\)
可以匹配
select * from agent where code in ('abc123', 'a', 'b')
并返回'abc123', 'a', 'b'
但它失败了:
select * from agent where code in ('abc123', '(a)', 'b')
select * from agent where code in ('abc123', '(a)))', 'b')
select * from agent where code in ('abc123', '(a)))', 'b') and (code='a()')
答案 0 :(得分:1)
您可以使用:
(?sUi)\s+in\s*\(((?:[^)']+|'[^']*')*)\)
[^)']+
任何不是紧密的paren或撇号的东西|
或'[^']*'
一个字符串在SQL Server中,可以通过连续使用两个撇号来转义撇号:
(?sUi)\s+in\s*\(((?:[^)']+|'(?:[^']|'')*')*)\)
[^)']+
任何不是紧密的paren或撇号的东西|
或'(?:[^']|'')*'
但是,最好的解决方案是使用正确的SQL解析器/标记器。
答案 1 :(得分:0)
即使您已转义单撇号,也可以使用此表达式:
(?is)\s+in\s*\(((?:\s*,?\s*'[^'\\]*(?:\\.[^'\\]*)*')*)\)
或者也匹配字母数字值:
(?is)\s+in\s*\(((?:\s*,?\s*(?:\w+|'[^'\\]*(?:\\.[^'\\]*)*'))*)\)
^^^
请参阅demo
请注意,您不需要U
标志,因为量词应该是贪婪的。
模式说明:
(?is)
- 使模式不区分大小写,让.
也匹配换行符\s+in\s*
- 一个或多个空格,in
和0 +空格\(
- 文字(
((?:\s*,?\s*(?:\w+|'[^'\\]*(?:\\.[^'\\]*)*'))*)
- 第1组捕获0次或更多次:
\s*,?\s*
- 可选的空格(0或更多),后跟可选的逗号和0 +空格\w+
- 一个或多个字母数字/下划线符号|
- 或'[^'\\]*(?:\\.[^'\\]*)*'
- 带有转义'
支持的单引号字符串文字\)
- 文字)