문제

중괄호 안의 내용과 일치하는 정규식이 있습니까?예를 들어 다음과 같습니다.

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))*\}/
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top