#regex
#регулярное выражение
Вопрос:
Я пытаюсь создать регулярное выражение, которое будет соответствовать вложенным фигурным скобкам, но не будет соответствовать одиночным фигурным скобкам.
Например, учитывая эту строку:
" { { I'm so cool, I'm nested } } I'm neither { I'm just boring normal braces } "
Регулярное выражение должно соответствовать:
{ { I'm so cool, I'm nested } }
Но не:
{ I'm just boring normal braces }
Я думаю, что я почти на месте, я играл с тестером регулярных выражений, чтобы попытаться заставить его работать, однако я, должно быть, что-то упускаю.
Это то, что я получил до сих пор:
(?(?={(?>[^{}] |(?R))*})({(?>[^{}] |(?R))*}))
Тем не менее, оно по-прежнему соответствует одиночным.
Идея в том, что он использует оператор if с положительным прогнозом, чтобы проверить, есть ли вложенные фигурные скобки. Если они есть, они им соответствуют. Я не могу понять, как исключить обычные.
Комментарии:
1. Что должно произойти, когда у вас есть
{ { I'm so cool, {I'm super nested} } }
в качестве входных данных? Также о чем{ { I'm so cool, { {I'm mega nested} } } }
?
Ответ №1:
Вы можете сгруппировать его и получить совпадение по индексу 1.
({s*{ .*?} s*})
Вот демонстрация регулярного выражения101
Комментарии:
1. вы можете использовать
s*
, если между {
Ответ №2:
Это должно работать точно для вложенных завитушек 2-го уровня:
{[^{}]*{([^}]*)}
Ответ №3:
({( ?){ ( ?)(.*) ( ?)}( ?)})
Соответствует строке, которую вы ищете. Также не имеет значения, есть ли пробелы между скобками или нет с этим.
Демонстрация в Regexr
Ответ №4:
Комментарии:
1. Упс, похоже, @Braj меня опередил. 🙂
2. Я отредактировал шаблон, чтобы сделать его нескладным. В противном случае это приведет к сбою
3. Спасибо! Оригинал соответствовал бы тому, что он пытался сделать, но версия ungreedy, вероятно, то, что он действительно хотел.
Ответ №5:
Ваш текущий шаблон, похоже, отлично работает для меня в Regex101. Оно не соответствует одиночным скобкам! Но я смог обобщить это для вас следующим образом:
({(?:[^{}]|(?R)) })
На самом деле вам не нужно if .