SQL脚本的正则表达式预测/后观匹配

时间:2016-01-21 14:52:34

标签: regex tsql sublimetext2 sqlcmd

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

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

我试图匹配:

  1. 以USE开头的字符串(忽略空格)
  2. 后面是可选的方括号
  3. 后跟一个或多个非空白字符。
  4. 除了该文本的位置&#34; master&#34; (不区分大小写)
  5. 或者除了该文本是$符号
  6. 之外

    预期结果:

    USE [master] - 不匹配

    USE [$(CompiledDatabaseName)] - 不匹配

    USE [anything_else.01234] - 匹配

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

    我使用Sublime Text 2作为我的RegEx搜索工具并引用此cheatsheet

1 个答案:

答案 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中转义)
  • ] - 零,一个或两个]括号(在字符类之外,结束方括号不需要转义)