Регулярное выражение для сопоставления вложенных (но не одиночных) фигурных скобок?

#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:

Это работает для вас?

 {s*{.*?}s*}
 

http://regex101.com/r/zA1bP2

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

1. Упс, похоже, @Braj меня опередил. 🙂

2. Я отредактировал шаблон, чтобы сделать его нескладным. В противном случае это приведет к сбою

3. Спасибо! Оригинал соответствовал бы тому, что он пытался сделать, но версия ungreedy, вероятно, то, что он действительно хотел.

Ответ №5:

Ваш текущий шаблон, похоже, отлично работает для меня в Regex101. Оно не соответствует одиночным скобкам! Но я смог обобщить это для вас следующим образом:

 ({(?:[^{}]|(?R))  })
 

На самом деле вам не нужно if .