Есть ли способ сопоставить указанный шаблон c в фигурных скобках несколько раз с помощью регулярных выражений? - PullRequest
1 голос
/ 06 февраля 2020

Я использую старый язык, в котором нет встроенных подсветок синтаксиса.

Несмотря на то, что notepad ++ имеет пользовательские языковые функции, некоторые случаи не поддерживаются. В этих случаях я использую сценарий python, который применяет подсветку синтаксиса с помощью регулярных выражений.

Моя текущая проблема, с которой я столкнулся, заключается в использовании регулярных выражений для поиска шаблонов в фигурных скобках. Шаблон, который я пытаюсь найти, равен [A-Za-z_]\w*. Таким образом, в основном, имя переменной. Однако я хотел бы сопоставлять только экземпляры, встречающиеся в двойных фигурных скобках.

В следующей строке я хотел бы сопоставить оба экземпляра TimeStamps и Descending и ничего больше. Test Test2'{{TimeStamps(Descending(1))(7:8)}}/{{TimeStamps(Descending(1))(1:4)}} - '

Я пробовал варианты этого (?<={{)([A-Za-z_]\w*)*(?=[0-9\(\)\:]*}}), но мне кажется, что я слишком усложняю его для себя.

Любая помощь приветствуется. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вы можете использовать

\b[A-Za-z_]\w*(?=(?:(?!{{|}}).)*}})

См. Демоверсию regex

Подробности

  • \b - граница слова
  • [A-Za-z_] - буква ASCII или _
  • \w* - любые 0 или более символов слова (буквы, цифры или _)
  • (?=(?:(?!{{|}}).)*}}) - положительный прогноз, требующий
    • (?:(?!{{|}}).)* - любой символ, 0 или более вхождений, кроме символов разрыва строки, который не запускает подстроку {{ или }} (it * жадный жетон )
    • }} - подстрока }}.
1 голос
/ 06 февраля 2020

Вы можете использовать свой шаблон для сопоставления переменной, сначала сопоставив {{, а затем заявив, что присутствует закрывающий }} подарок без совпадения {{ между ними.

(?:{{(?=[^{}]*(?:{(?!{)|}(?:!}))*}})|\G(?!^))\(?\K[A-Za-z_]\w*
  • (?: Группа без захвата
    • {{ Совпадение буквально
    • (?= Позитивный прогноз, утверждают, что справа
      • [^{}]* Совпадение 0+ вхождений любой символ, кроме { или }
      • (?:{(?!{)|}(?:!}))* Если есть { или }, утверждают, что за ним не следует тот же самый символ
      • }} Совпадение буквально
    • ) Закрыть взгляд вперед
    • | Или
  • \G(?!^) Утвердить позицию в конце предыдущего сопоставить
  • ) Закрыть группу
  • \(?\K сопоставить необязательно ( и забыть, что в данный момент сопоставляется
  • [A-Za-z_]\w* Шаблон для сопоставления с varialbe

Regex demo

...