Регулярное выражение запрещает выбирать символы из предыдущего матча - PullRequest
1 голос
/ 10 марта 2019

Мое название, вероятно, не объясняет точно, что я имею в виду. Возьмите следующую строку:

POWERSTART9^{{2|3}}POWERENDx{{3^EXSTARTxEXEND}}=POWERSTART27^{{1|4}}POWEREND

То, что я хочу сделать здесь, это выделить части, которые похожи на это:

{{2|3}} or {{1|4}}

Следующее выражение работает до некоторой степени, оно выбирает первое {{2 | 3}} без проблем:

\{\{(.*?)\|(.*?)\}\}

Проблема в том, что это не просто выбор первого if {{2 | 3}} и второго из {{1 | 4}}, потому что после первого у нас есть {{3 ^ EXSTARTxEXEND}}, поэтому он принимает начальная точка от {{3 и до самого конца второй части, которую я хочу | 4}}

Здесь выделено на RegExr:

enter image description here

Я никогда не был хорош в регулярных выражениях и не могу понять, как это остановить. Есть идеи? Я в основном хочу, чтобы он совпадал только с точным шаблоном, а не с тем, что его содержит.

Ответы [ 2 ]

1 голос
/ 10 марта 2019

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

\{\{((?:(?!{{).)*?)\|(.*?)}}

См. Демонстрационную версию regex .

Если в подстроках {{...}} не может быть { и }, вы можете использовать более простое выражение \{\{([^{}|]*)\|([^{}]*)}} (см. demo ).

Подробности

  • \{\{ - a {{ substring
  • ((?:(?!{{).)*?) - Группа захвата 1: любой символ (.), как можно меньше (*?), который не запускает последовательность символов {{ ( закаленный жадный)токен )
    • [^{}|]* - любые 0 или более символов, кроме {, } и |
  • \| - a| char
  • (.*?) - Группа захвата 2: любые 0 или более символов, как можно меньше
    • [^{}]* - любые 0 или более символов, кроме { и }
  • }} - подстрока }}.
0 голосов
/ 10 марта 2019

Попробуйте это \{\{([^\^|]*)\|([^\^|]*)\}\}

https://regex101.com/r/bLF8Oq/1

...