Регулярное выражение для содержимого в фигурных скобках
Есть ли регулярное выражение для соответствия содержимого в фигурных скобках. Например со следующим:
d = {'key': {'a': [1,2,3]}}
Я хотел бы сопоставить {'key': {'a': [1,2,3]}} и {'a': [1,2,3]}, но не {'key': {'a': [1,2,3]}
4 ответа
В классических регулярных выражениях это невозможно - DFA не могут анализировать вложенные пары.
Есть способы сделать это с помощью расширенных регулярных выражений, таких как рекурсивные выражения, которые разрешены в некоторых движках регулярных выражений (например, в регулярных выражениях Perl), но они не всегда симпатичны. (слишком много PHP предоставлено в версии Perl: /\{(?:[^{}]+|(?R))*\}/
с (?R)
опция, являющаяся рекурсивным соответствием.)
Вам не обязательно нужно регулярное выражение, чтобы делать такие вещи, хотя. Вы можете сделать это, просто пройдя по списку и сохранив стопку открытых скобок (и в каком положении они были замечены). Затем, когда вы видите открытую фигурную скобку, вы помещаете ее позицию в стек, а всякий раз, когда вы видите закрывающую фигурную скобку, вы удаляете последнюю открытую фигурную скобку из стека и используете ее позицию плюс текущую позицию в качестве границ для подстроки. который становится одним из ваших матчей. Повторяйте, пока не дойдете до конца строки.
Это довольно просто, но находит совпадение:)
{'key': {'\w+': \[[\w,]*\w\]}}
Библиотека регулярных выражений PCRE может сделать это с помощью рекурсии:
/\{(?:[^{}]+|(?R))*\}/
Регулярные выражения не могут обрабатывать вложение, поэтому в общем случае нет регулярных выражений.
Если вы можете ограничить максимальную глубину вложения, вы, вероятно, сможете создать выражение, которое явно проверяет все возможные уровни вложения. Как правило, вам, вероятно, будет лучше использовать какую-то инфраструктуру парсера.