我正在尝试分析一些 SQLCMD 脚本以进行代码质量测试。我有一个正则表达式没有按预期工作:
^(\s*)USE (\[?)(?<![master|\$])(.)+(\]?)
我正在尝试匹配:
- 以 USE 开头的字符串(忽略空格)
- 后跟可选的方括号
- 后跟 1 个或多个非空白字符。
- 除非文本是“master”(不区分大小写)
- 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/