如何匹配SQL IN运算符的表达式包含使用正则表达式的嵌套大括号?

时间:2016-07-15 09:37:56

标签: regex

我想在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()')

2 个答案:

答案 0 :(得分:1)

您可以使用:

(?sUi)\s+in\s*\(((?:[^)']+|'[^']*')*)\)
  • [^)']+任何不是紧密的paren或撇号的东西
  • |
  • '[^']*'一个字符串

Demo

在SQL Server中,可以通过连续使用两个撇号来转义撇号:

(?sUi)\s+in\s*\(((?:[^)']+|'(?:[^']|'')*')*)\)
  • [^)']+任何不是紧密的paren或撇号的东西
  • |
  • '(?:[^']|'')*'
    • 撇号后跟着
      • 任何不是撇号的内容
      • 或双撇号
    • 后跟撇号

Demo

但是,最好的解决方案是使用正确的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+ - 一个或多个字母数字/下划线符号
    • | - 或
    • '[^'\\]*(?:\\.[^'\\]*)*' - 带有转义'支持的单引号字符串文字
  • \) - 文字)