Регулярное выражение для сопоставления переменных только в кавычках внутри

#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/1

4. У вас было время проверить это?

Ответ №1:

Для приведенного примера текста….

Попробуй:

 (?:s|=)(?:"[^"]*@[^"]*"|(?:s|=)'[^']*@[^']*')
 

ДЕМОНСТРАЦИЯ:

введите описание изображения здесь

Ответ №2:

С помощью PCRE и для

чтобы проверить, что в совпадении появляется даже один @ char

Вы можете использовать чередование, исключающее или " или ' , а также исключающее сопоставление @ , добавляя его в класс отрицаемых символов.

Чтобы получить оба значения в одной группе, вы можете использовать группу сброса ветвей.

 =h*(?|"([^"@]*@[^"@] )"|'([^@']*@[^'@]*)')
 

Шаблон совпадает:

  • =h* Совпадающие = и необязательные символы горизонтальных пробелов
  • (?| Группа сброса филиала
    • "( Матч " и начало группы 1
      • [^"@]*@ Сопоставьте необязательные символы, отличные от " или @ , а затем сопоставьте @
      • [^"@] Сопоставьте 1 символов, отличных от " или @
    • )" Закрыть группу 1 и atch "
    • | Или
    • '([^@']*@[^'@]*)' То же, что и в предыдущем случае, на этот раз для '
  • ) Закрыть группу сброса филиала

Демонстрация регулярных выражений