Найти ближайшие скобки для строки с помощью Regex - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть следующая строка {[ab]} {[c] } { [d] } {[f]} { = [abc] qwqw = =qwwq= =wq }, я пытаюсь извлечь группу с помощью определенной строки, которая находится внутри одной из скобок, например:

ab -> {[ab]}

d -> {[d]}

abc -> {= [abc] qwqw = = qwwq = = wq}

Как только я получуВ результате я хочу заменить его чем-то другим.

Я попытался использовать несколько различных шаблонов регулярных выражений:

\{(.*?\[(?:abc)\].*?)\}
([^}][{].*?\[(?:abc)\].*?[}])
({+?(?<=)\[(?:abc)\].*?[}])
^(?:.*)({.*?\[(?:abc)\].*?[}])

Но ни один из них не работает должным образом. Они либо совпадают с слишком большим количеством строки или слишком небольшим количеством строки.

1 Ответ

1 голос
/ 01 ноября 2019

Эта часть (?:abc) будет соответствовать строке abc и не нуждается в группе без захвата. Это не будет соответствовать ни a, ни ab и т. Д.

Одним из вариантов может быть использование группы захвата и класса символов, повторяющих 1 или более раз любой из перечисленных [abcd]+, который также может быть aaa, если это нормально.

\{[^{}]*\[([abcd]+)\][^{}]*\}

По частям

  • \{ Совпадение {
  • [^{}]* Совпадение 0+ раз, а не { или }
  • \[ Совпадение [
  • ([abcd]+) Захват группа 1 , совпадение 1+ раз с любым из перечисленных
  • \] Совпадение ]
  • [^{}]* совпадение 0+ раз не { или }
  • \} совпадение }

см. Regex demo

Если вы хотите сопоставить только abc ab c или d, вы также можете использовать чередование, сопоставляющее ab с необязательным c, или c или d

\{[^{}]*\[(abc?|c|d)\][^{}]*\}

Regex demo

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