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

Regex 什么正则表达式允许我指定匹配文本必须在其中的开始和结束文本?,regex,sublimetext3,Regex,Sublimetext3,我想使用正则表达式让Sublime Text 3搜索某个代码实例,但只能在两个边界字符串内搜索。具体地说,我试图找到所有没有显式连接两个表的查询。例如,我们可能有以下代码: <!--- This is a test comment with from included, a match that we would like to avoid ---> Test <cfquery> select test fro

我想使用正则表达式让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>

试验
选择测试
从表1到表2
测试2
选择测试
来自表1
内连接表2
测试3
选择测试
从表1中,
表2
我希望regex匹配第一个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]>)
()[\S\S]*?([fF][rR][oO][mM])[\S\S]*?,[\S\S]*?()
但是,此正则表达式会匹配第一个块,然后匹配整个剩余文件,因为尽管第二个块不匹配,但它不会停止尝试匹配,直到它到达文件底部的“/cfquery”。这是有道理的;这正是我要求它做的。但是我如何让正则表达式停止搜索某个单词呢

我尝试过使用锚($和^和\z),但这些锚不是为我的需要而设计的,或者我没有正确地使用它们。我认为尝试告诉regex在匹配中不能出现斜杠可能是解决方案:

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

但这与以前的匹配相同,我不知道为什么。

老式隐式SQL连接的标志是
FROM
子句中的一个或多个逗号。也就是说,如果我们看到
FROM
后面跟有一个表名,然后后面只跟可能的空格和逗号,那么它就是一个老式的连接。尝试在不区分大小写模式下搜索以下模式:

FROM\s+\S+\s*,

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

编辑:

如果还希望仅查找包含在
标记中的逗号联接,请尝试以下模式:

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

请尝试
(?si)(?:(?!)*从(?-s)。*,(?s)。*?
,查看此内容。@WiktorStribiżew谢谢。当我使用你的演示时,它工作得非常好。然而,当我自己去复制/粘贴它时,它不起作用,说斜杠必须转义。当我在升华文本3中尝试它时(有斜杠和没有斜杠),它返回零结果。知道为什么吗?在regex101中,请看我的演示,我使用
~
作为regex分隔符。在SublimiteText中,请确保未启用“整词”选项。@WiktorStribiżew啊,我现在看到分隔符了,谢谢。我没有“全字”和“区分大小写”。不幸的是,我尝试的每个变体仍然没有返回任何结果。它在正则表达式引擎的使用上是一致的;谢谢和我的尝试相比,这简直太简单了。但是,它也捕获了许多我不希望它捕获的实例(例如我在问题中编辑的注释行)。有没有办法将其限制为仅在cfQuery标记中查看?@Nicholas我根据您的要求更新了我的答案。同时看看Wiktor的评论/回答,因为他可能有比我给你的更好的选择。谢谢。ST3不支持很多标志,所以我在编辑的正则表达式的开头添加了(?s)。这在演示中起作用,但ST3返回的结果为零。如果我找到了解决方案,我会玩这个并发回。否则,您的原始响应将与一些手动过滤一起工作。谢谢。@Nicholas我又给了你一次编辑。您的正则表达式工具可能不支持点所有模式。试试我答案中的最后一个模式,看看这是否能解决问题。谢谢蒂姆。这种编辑在ST3的findinfiles命令中仍然不起作用,尽管它在简单精细模式下起作用。
<cfquery>((?!<\/cfquery>)[\s\S])*FROM\s+\S+\s*,[\s\S]*?<\/cfquery>