중괄호 안의 내용에 대한 정규식
-
07-07-2019 - |
문제
중괄호 안의 내용과 일치하는 정규식이 있습니까?예를 들어 다음과 같습니다.
d = {'key': {'a': [1,2,3]}}
나는 일치하고 싶다 {'열쇠':{'ㅏ':[1,2,3]}} 그리고 {'ㅏ':[1,2,3]}, 하지만 {'열쇠':{'ㅏ':[1,2,3]}
해결책
고전적인 정규 표현식에서는 불가능합니다. DFA는 중첩 된 쌍을 구문 분석 할 수 없습니다.
일부 Regex 엔진 (예 : Perl Regex)에서 허용되는 재귀 표현과 같은 연장 된 정규 표현식으로 수행 할 수있는 방법이 있지만 항상 예쁘지는 않습니다. (너무 많은 PHP Perl 버전 제공 : /\{(?:[^{}]+|(?R))*\}/
이랑 (?R)
옵션은 재귀 경기입니다.)
그래도 이런 종류의 일을하기 위해 반드시 Regex가 필요하지는 않습니다. 목록을 걸어 가서 열린 버팀대 더미 (그리고 그들이 보았던 위치)를 유지함으로써 간단히 할 수 있습니다. 그런 다음 열린 브레이스가 보일 때마다 스택에 위치를 밀고 가까운 브레이스가 보일 때마다 가장 최근에 보이는 열린 버팀대를 스택에서 튀어 나와 위치와 기판의 경계로 현재 위치를 사용합니다. 그것은 당신의 경기 중 하나가됩니다. 문자열 끝에 도달 할 때까지 반복하십시오.
다른 팁
상당히 간단하지만 경기를 찾습니다 :)
{'key': {'\w+': \[[\w,]*\w\]}}
정규식은 중첩을 처리할 수 없으므로 일반적인 경우에 작동하는 정규식이 없습니다.
최대 중첩 깊이를 제한할 수 있는 경우 가능한 모든 중첩 수준을 명시적으로 확인하는 표현식을 구성할 수 있습니다.일반적으로 일종의 파서 프레임워크를 사용하는 것이 더 나을 것입니다.
PCRE Regex 라이브러리는 재귀를 사용하여이를 수행 할 수 있습니다.
/\{(?:[^{}]+|(?R))*\}/