正则表达式 lookahead/lookbehind 匹配 SQL 脚本
Regex lookahead/lookbehind match for SQL script
我正在尝试分析一些 SQLCMD 脚本以进行代码质量测试。我有一个正则表达式没有按预期工作:
^(\s*)USE (\[?)(?<![master|$])(.)+(\]?)
我正在尝试匹配:
- 以 USE 开头的字符串(忽略空格)
- 后跟可选的方括号
- 后跟 1 个或多个非空白字符。
- 除了文本是 "master"(不区分大小写)
- 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}
解释:
^
- 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 之外,右方括号不需要转义)
我正在尝试分析一些 SQLCMD 脚本以进行代码质量测试。我有一个正则表达式没有按预期工作:
^(\s*)USE (\[?)(?<![master|$])(.)+(\]?)
我正在尝试匹配:
- 以 USE 开头的字符串(忽略空格)
- 后跟可选的方括号
- 后跟 1 个或多个非空白字符。
- 除了文本是 "master"(不区分大小写)
- 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}
解释:
^
- Sublime Text 中一行的开头\h*
- 可选水平空格(如果需要匹配换行符,使用\s*
)USE
- 文字 case-sensitive 字符序列USE
(?!\h*\[{0,2}[^]\s]*(?:$|(?i:master)))
- 确保USE
后面没有跟随的否定前瞻:\h*
- 零个或多个水平空格\[{0,2}
- 零个、一个或两个[
括号[^]\s]*
-]
和空格 以外的零个或多个字符
(?:$|(?i:master))
-$
或 case-insensitivemaster
(我们使用(?i:...)
构造关闭区分大小写)
\h*
- 继续匹配零个或多个水平空格\[{0,2}
- 零个、一个或两个[
括号[^]\s]*
- 除了]
和空格之外的零个或多个字符(当]
是字符 class 中的第一个字符时,它不必是在 Boost/PCRE 正则表达式中转义)]{0,2}
- 零个,一个或两个]
括号(在字符 class 之外,右方括号不需要转义)