Какое регулярное выражение позволяет мне указать начальный и конечный текст, в котором должен быть соответствующий текст? - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы использовать 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 голосов
/ 20 сентября 2018

Отличительной чертой неявного SQL-соединения старой школы является одна или несколько запятых в предложении FROM.То есть, если мы видим, что FROM следует за именем таблицы, за которым следуют только пробелы и запятая, тогда это соединение старой школы.Попробуйте выполнить поиск по следующей схеме в режиме нечувствительности к регистру:

FROM\s+\S+\s*,

Демо

Это работает, по крайней мере, на данных образца, которые вы предоставили,Обратите внимание, что этот шаблон не выделяет все оскорбительные запросы.Но, возможно, для ваших целей достаточно просто иметь строку внутри ошибочного запроса.

Редактировать:

Если вы также хотите найти только запятые объединения, заключенные в <cfquery> тегов, затем попробуйте следующий шаблон:

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

Демо

Приведенные выше регулярные выражения предназначены для запуска в случае нечувствительности,Режим DOT ALL, где . соответствует символу новой строки.Если ваш инструмент не поддерживает dot all, тогда вы можете использовать [\s\S] для соответствия между новыми строками.В этом случае приведенное выше регулярное выражение станет таким:

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