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

标签 regex tsql sublimetext2 sqlcmd

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

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

我正在尝试匹配:

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

预期结果:

USE [master] - 不匹配

USE [$(CompiledDatabaseName)] - 不匹配

使用 [anything_else.01234] - 匹配

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

我正在使用 Sublime Text 2 作为我的正则表达式搜索工具并引用此 cheatsheet

最佳答案

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

你可以使用

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

参见 regex demo

解释:

  • ^ - 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 正则表达式中转义)
  • ]{0,2} - 零、一或两个 ]括号(在字符类之外,右方括号不需要转义)

关于SQL 脚本的正则表达式前瞻/后视匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34926951/

相关文章:

regex - .htaccess:阻止访问文件并阻止目录浏览

regex - IIS7 URL 重写正则表达式

Java 正则表达式转义字符

sql - 在 SQL Server 中将星期一的数据与之前星期一的数据进行比较

ubuntu - 无法在 Sublime text 2 中安装包控件

c# - 有正则表达式吗?

sql - 如何从 SQL 查询设置变量?

SQL字符分隔字段分隔列

sublimetext2 - 在Sublime Text 2/3中设置特定文件名的语法

python - 找不到有效的 Python 解释器。请在您的 LaTeXTools 设置中设置 python 设置