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

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть текст, аналогичный шаблону:

 new{test}anotherone{test{nest}}new1{test1}new2{test2}
  

Я новичок в регулярных выражениях и пытаюсь создать шаблон, который соответствует группам таким образом, чтобы для каждого совпадения:
Группа 1: новая
Группа 2: тест

У меня это работает с ([S][a-z#-()->] ){([^? ]*?)} использованием JavaScript

Однако я хочу игнорировать блок с вложенностью, так что anotherone{test{nest}} он игнорируется при сопоставлении. Вот моя попытка с регулярным выражением101

Заранее спасибо!

Обновление: строка также может быть вложена во вложенную часть, например

 new{test}ignore_this{test1{test1}{test2{test2}}new{test}new{test}
  

Таким образом, он должен соответствовать только: Group1: new / Group2: test

Комментарии:

1. Попробуйте b(?<![{}])(w ){([^{}]*)} , посмотрите демонстрацию .

2.Вы также можете получить 2 совпадения в конце, используя отрицательный прогноз в конце ([^s{}] ){([^{}]*)}(?!}) regex101.com/r/CSrZWq/1

Ответ №1:

Вы можете попробовать это регулярное выражение для сопоставления каждой пары new и test (3 пары в вашем вводе):

 (?<!{)b([^{}] ){([^{}]*)}(?![^{}]*})
  

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

Подробности регулярного выражения:

  • (?<!{) : Убедитесь, что у нас нет { в предыдущей позиции
  • b : Граница слова
  • ([^{}] ) : Сопоставить 1 любого символа, который не { является и } в группе #1
  • { : Сопоставить {
  • ([^{}]*) : Сопоставление 0 любого символа, который не { является и } в группе #2
  • } : Сопоставить }
  • (?![^{}]*}) : Отрицательный прогноз, чтобы утверждать, что у нас нет закрытия } впереди без каких-либо { и } между ними

Комментарии:

1. Спасибо! Что, если строка имеет вложенность внутри нее? Например, new{test}ignore_this{test1{test1}{test2{test2}}new{test}new{test} и я хочу игнорировать все ignore_this{test1{test1}{test2{test2}} ? Я могу обновить вопрос, чтобы отразить этот крайний случай 🙂

2. @o1n3n21: У вас была возможность попробовать мой обновленный ответ? Также не понимаю причины снижения здесь.

3. Спасибо, я только что принял ответ и не проголосовал против, не зная, откуда это взялось. Еще раз спасибо за вашу помощь!