#regex #pcre
Вопрос:
У меня много sql-файлов. Я пытаюсь найти файлы, содержащие переменную (формат @varname
), ТОЛЬКО если они отображаются в совпадающих одинарных или двойных кавычках. Меня волнует только то, что он существует и есть, мне просто нужно знать файлы, в которых это происходит.
Я могу сопоставить все строки в кавычках, но не могу понять, как проверить, что @
в совпадении появляется хотя бы один символ
сопоставление пар одинарных и двойных кавычек (["'])(.*?)1
пример файла:
…инструкции sql
выберите @sql = ‘выберите * из
пользователей, где id = @id ‘…дополнительные инструкции sql
Заранее спасибо.
Редактировать
Вот лучший пример файла с комментариями (комментариями sql), которым должны соответствовать операторы, и примерами тех, которые не должны совпадать
...sql statements
-- only this quoted string would match
select @sql = "select * from
Users where id = @id "
-- other statements that wouldn't match because not in a pair of quotes
if ltrim(isnull(@stat,'')) <> '' and @stat <> '""'
begin
select @sql = @sql " and Stat in (" @stat ")"
end
if isnull(@atype,'') <> ''
begin
select @sql = @sql " and Type in (" @atype ")"
end
...more sql statements
Комментарии:
1. Что-то вроде
(?s)(["'])((?:(?!1)[^@])*@.*?)1
?2. Спасибо за комментарий. Это действительно близко! Это дает некоторые ложные срабатывания, я обновил вопрос, чтобы включить некоторые примеры вещей, которые не должны совпадать
3. Какая умопомрачительная вещь… Попробуй
(?m)(?:^h*--.*|(["'])(?:(?!1)[^@])*1)(*SKIP)(*F)|(?s)(["'])(?:(?!2)[^@])*@.*?2
, увидишь regex101.com/r/lS8F9f/14. У вас было время проверить это?
Ответ №1:
Для приведенного примера текста….
Попробуй:
(?:s|=)(?:"[^"]*@[^"]*"|(?:s|=)'[^']*@[^']*')
ДЕМОНСТРАЦИЯ:
Ответ №2:
С помощью PCRE и для
чтобы проверить, что в совпадении появляется даже один @ char
Вы можете использовать чередование, исключающее или "
или '
, а также исключающее сопоставление @
, добавляя его в класс отрицаемых символов.
Чтобы получить оба значения в одной группе, вы можете использовать группу сброса ветвей.
=h*(?|"([^"@]*@[^"@] )"|'([^@']*@[^'@]*)')
Шаблон совпадает:
=h*
Совпадающие=
и необязательные символы горизонтальных пробелов(?|
Группа сброса филиала"(
Матч"
и начало группы 1[^"@]*@
Сопоставьте необязательные символы, отличные от"
или@
, а затем сопоставьте@
[^"@]
Сопоставьте 1 символов, отличных от"
или@
)"
Закрыть группу 1 и atch"
|
Или'([^@']*@[^'@]*)'
То же, что и в предыдущем случае, на этот раз для'
)
Закрыть группу сброса филиала