我想使用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]>)
但这与以前的匹配,我不确定为什么。
答案 0 :(得分:1)
在FROM
子句中,一个老式的隐式SQL连接的标志是一个或多个逗号。也就是说,如果我们看到FROM
紧跟着一个表名,然后除了可能的空格和逗号外什么都紧随其后,则它是一个老式的联接。尝试在不区分大小写的模式下搜索以下模式:
FROM\s+\S+\s*,
这至少对您提供的样本数据有效。请注意,此模式不会突出显示整个有问题的查询。但是也许出于您的目的,仅在令人讨厌的查询中插入一行就足够了。
编辑:
如果您还只想查找<cfquery>
标记内包含的逗号联接,请尝试以下模式:
<cfquery>((?!<\/cfquery>).)*FROM\s+\S+\s*,.*?<\/cfquery>
以上正则表达式旨在在不区分大小写的DOT ALL模式下运行,其中.
与换行符匹配。如果您的工具不支持全部点号,则可以使用[\s\S]
来匹配换行符。在这种情况下,上面的正则表达式将变为:
<cfquery>((?!<\/cfquery>)[\s\S])*FROM\s+\S+\s*,[\s\S]*?<\/cfquery>