我试图分析一些SQLCMD脚本以进行代码质量测试。我的正则表达式没有按预期工作:
^(\s*)USE (\[?)(?<![master|\$])(.)+(\]?)
我试图匹配:
$
符号预期结果:
USE [master]
- 不匹配
USE [$(CompiledDatabaseName)]
- 不匹配
USE [anything_else.01234]
- 匹配
此外,上述相同的模式没有[
和]
字符。
我使用Sublime Text 2作为我的RegEx搜索工具并引用此cheatsheet
答案 0 :(得分:2)
您的模式 - {
"manifest_version": 2,
"name": "Emoticons",
"description": "A collection of emoticons for Social Media, directly accessible in your browser!",
"version": "1.0",
"content_scripts": [{
"js": [
"js/jquery.min.js",
"js/jquery-ui.min.js",
"js/load.js"
],
"css": [
"css/emoticon.css",
"css/style.css"
],
"run_at": "document_end",
"matches": ["http://*/"]
}],
"browser_action": {
"default_icon": "images/icon.png",
"default_popup": "popup.html"
}
}
- 如果您在其中修复字符类问题(即将^(\s*)USE (\[?)(?<![master|\$])(.)+(\]?)
替换为{{1}),则使用可变宽度的lookbehind(其长度事先未知)因为你的意思是[...]
或字符序列(...)
)的替代列表,因此在Boost正则表达式中无效。您的$
捕获是错误的,因为此组只包含最后捕获的一个字符(您可以使用master
),但这也匹配空格(当您需要 1个或更多非空白字符时< / em>的)。 (.)+
是一次或零次量词,但是你说你可能有2个开始和结束括号(所以,你需要一个限制量词(.+)
)。
您可以使用
?
请参阅regex demo
<强>解释强>:
{0,2}
- 在Sublime Text ^\h*USE(?!\h*\[{0,2}[^]\s]*(?:\$|(?i:master)))\h*\[{0,2}[^]\s]*]{0,2}
- 可选的水平空格(如果您需要匹配换行符,请使用^
)\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 regexps中转义)]
- 零,一个或两个]
括号(在字符类之外,结束方括号不需要转义)