SQL脚本中的正则表达式前瞻/后顾匹配

3

我正在尝试分析一些SQLCMD脚本以进行代码质量测试。我有一个正则表达式没有按预期工作:

^(\s*)USE (\[?)(?<![master|\$])(.)+(\]?)

我正在尝试匹配以下内容:
  1. 以USE开头的字符串(忽略空格)
  2. 后跟可选的方括号
  3. 后跟一个或多个非空白字符。
  4. 但该文本为“master”(不区分大小写)时除外
  5. 或者当该文本是$符号时除外
预期结果:

USE [master] - 不匹配

USE [$(CompiledDatabaseName)] - 不匹配

USE [anything_else.01234] - 匹配

此外,上述模式没有[]字符。
我正在使用Sublime Text 2作为我的RegEx搜索工具,并参考此速查表

什么是 alpha text - Wiktor Stribiżew
我用正确的意思编辑了更正。 - Adam
可以嵌套 [...] 吗? - Wiktor Stribiżew
请使用 USE somestringUSE [somestring],不要使用 USE [[somestring]] - Adam
尝试使用^(?!\h*USE\h*\[{0,2}[^]\s]*(?:\$|(?i:master)))\h*USE\h*\[{0,2}[^]\s]*]{0,2}进行匹配。 \ h代表水平空格,但如果需要匹配换行符,请切换到\ s。 缩短版本:[^\h*USE(?!\h*\[{0,2}[^]\s]*(?:\$|(?i:master)))\h*\[{0,2}[^]\s]*]{0,2}](https://regex101.com/r/aB1jD4/2) - Wiktor Stribiżew
太棒了!我向您致敬,先生!请能否将其添加为答案,以便我可以标记为正确。 - Adam
1个回答

3
您的模式 - ^(\s*)USE (\[?)(?<![master|\$])(.)+(\]?) - 使用了一个具有可变宽度的回顾断言(其长度事先未知),如果您在其中修复字符类问题(即将[...]替换为(...),因为您意味着$的备选列表或字符序列master),因此在Boost正则表达式中无效。您的捕获组(.)+是错误的,因为这个组只包含最后一个被捕获的字符(您可以使用(.+)),但这也会匹配空格(而您需要1个或多个非空格字符)。一次或零次量词,但是您说可能有2个开放和关闭括号(因此,您需要一个限定量词{0,2})。
您可以使用
^\h*USE(?!\h*\[{0,2}[^]\s]*(?:\$|(?i:master)))\h*\[{0,2}[^]\s]*]{0,2}

请参见 正则表达式演示 说明:
  • ^ - Sublime Text 中的行首定位符
  • \h* - 可选水平空格(如果需要匹配换行符,请使用\s*
  • USE - 一个字面上区分大小写的字符序列 USE
  • (?!\h*\[{0,2}[^]\s]*(?:\$|(?i:master))) - 负向先行断言,确保 USE 后面没有以下内容:
    • \h* - 零个或多个水平空格
    • \[{0,2} - 零、一个或两个 [ 括号
    • [^]\s]* - 除了 ] 和空格之外的零个或多个字符
    • (?:\$|(?i:master)) - 要么是 $,要么是不区分大小写的 master(我们使用 (?i:...) 结构关闭大小写敏感性)
  • \h* - 继续匹配零个或多个水平空格
  • \[{0,2} - 零、一个或两个 [ 括号
  • [^]\s]* - 除了 ] 和空格之外的零个或多个字符(当 ] 是字符类中的第一个字符时,在 Boost/PCRE regex 中不需要转义)
  • ]{0,2} - 零、一个或两个 ] 括号(在字符类外,闭合方括号不需要转义)

请检查说明,如果有任何不清楚的地方,请提问。我还对您的模式进行了评论。 - Wiktor Stribiżew
实际上,只应该有零个或一个 [ 括号。 - Adam
一或零 = ? 量词。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接