哪些正则表达式允许我指定匹配文本必须在其中的开始和结束文本?

时间:2018-09-20 13:47:42

标签: regex sublimetext3

我想使用Regex让Sublime Text 3搜索某个代码实例,但只能在两个边界字符串内。具体来说,我正在尝试查找未显式联接两个表的所有查询。因此,例如,我们可能具有以下代码:

    <!--- This is a test comment with from included, a match that we would like to avoid --->

    Test

    <cfquery>
        select  test
        from    table1,table2
    </cfquery>

    Test 2

    <cfquery>
        select  test
        from    table1
            inner join table2
    </cfquery>

    Test 3

    <cfquery>
        select  test
        from    table1,
            table2
    </cfquery>

我希望正则表达式匹配第一个cfquery块中的文本和第三个cfquery块中的文本,但不匹配第二个cfquery块中的文本。我现在拥有的正则表达式是:

    (<[cC][fF][qQ][uU][eE][rR][yY]>)[\S\s]*?([fF][rR][oO][mM])[\S\s]*?,[\S\s]*?(<\/[cC][fF][qQ][uU][eE][rR][yY]>)

但是,此正则表达式匹配第一个块,然后匹配整个剩余文件,因为尽管第二个块不匹配,但直到到达文件底部的“ / cfquery”,它才会停止尝试匹配。这很有道理;它正在完全按照我的要求去做。但是我如何要求正则表达式停止在某个单词上搜索?

我尝试使用锚($,^和\ z),但是这些锚不是为我的需要而设计的,或者我没有正确使用它们。我以为试图告诉正则表达式比赛中不能出现斜线可能是解决方案:

    (<[cC][fF][qQ][uU][eE][rR][yY]>)[\S\s]*?([fF][rR][oO][mM])[\S\s]*?,[\S\s]*?([^\/]*?)(<\/[cC][fF][qQ][uU][eE][rR][yY]>)

但这与以前的匹配,我不确定为什么。

1 个答案:

答案 0 :(得分:1)

FROM子句中,一个老式的隐式SQL连接的标志是一个或多个逗号。也就是说,如果我们看到FROM紧跟着一个表名,然后除了可能的空格和逗号外什么都紧随其后,则它是一个老式的联接。尝试在不区分大小写的模式下搜索以下模式:

FROM\s+\S+\s*,

Demo

这至少对您提供的样本数据有效。请注意,此模式不会突出显示整个有问题的查询。但是也许出于您的目的,仅在令人讨厌的查询中插入一行就足够了。

编辑:

如果您还只想查找<cfquery>标记内包含的逗号联接,请尝试以下模式:

<cfquery>((?!<\/cfquery>).)*FROM\s+\S+\s*,.*?<\/cfquery>

Demo

以上正则表达式旨在在不区分大小写的DOT ALL模式下运行,其中.与换行符匹配。如果您的工具不支持全部点号,则可以使用[\s\S]来匹配换行符。在这种情况下,上面的正则表达式将变为:

<cfquery>((?!<\/cfquery>)[\s\S])*FROM\s+\S+\s*,[\s\S]*?<\/cfquery>