正则表达式 lookahead/lookbehind 匹配 SQL 脚本

Regex lookahead/lookbehind match for SQL script

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

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

我正在尝试匹配:

  1. 以 USE 开头的字符串(忽略空格)
  2. 后跟可选的方括号
  3. 后跟 1 个或多个非空白字符。
  4. 除了文本是 "master"(不区分大小写)
  5. OR EXCEPT where that text is a $ symbol

预期结果:

USE [master] - 不匹配

USE [$(CompiledDatabaseName)] - 不匹配

USE [anything_else.01234] - 匹配

此外,上面的相同模式没有 [] 字符。

我正在使用 Sublime Text 2 作为我的 RegEx 搜索工具并引用这个 cheatsheet

你的模式 - ^(\s*)USE (\[?)(?<![master|$])(.)+(\]?) - 如果你修复其中的字符 class 问题(即替换 [...](...) 是指 $ 的替代列表或字符序列 master),因此在 Boost 正则表达式中无效。您的 (.)+ 捕获是错误的,因为该组将只包含捕获的最后一个字符(您可以使用 (.+)),但这也匹配空格(而您需要 1 个或更多 non-whitespace 个字符 )。 ? 一次或零次 量词,但你说你可能有 2 个左括号和右括号(因此,你需要一个限制量词 {0,2})。

你可以使用

^\h*USE(?!\h*\[{0,2}[^]\s]*(?:$|(?i:master)))\h*\[{0,2}[^]\s]*]{0,2}

regex demo

解释:

  • ^ - Sublime Text 中一行的开头
  • \h* - 可选水平空格(如果需要匹配换行符,使用\s*
  • USE - 文字 case-sensitive 字符序列 USE
  • (?!\h*\[{0,2}[^]\s]*(?:$|(?i:master))) - 确保 USE 后面没有跟随的否定前瞻:
    • \h* - 零个或多个水平空格
    • \[{0,2} - 零个、一个或两个 [ 括号
    • [^]\s]* - ] 和空格
    • 以外的零个或多个字符
    • (?:$|(?i:master)) - $ 或 case-insensitive master(我们使用 (?i:...) 构造关闭区分大小写)
  • \h* - 继续匹配零个或多个水平空格
  • \[{0,2} - 零个、一个或两个 [ 括号
  • [^]\s]* - 除了 ] 和空格之外的零个或多个字符(当 ] 是字符 class 中的第一个字符时,它不必是在 Boost/PCRE 正则表达式中转义)
  • ]{0,2} - 零个,一个或两个 ] 括号(在字符 class 之外,右方括号不需要转义)