2011-12-28 2 views
6

문자열은 다음 중 하나처럼 될 수 있습니다정규 표현식을 사용하여 패턴을 재귀 적으로 일치시킬 수 있습니까?

a(b,c) 
a(a(b,c),d) 
a(a(a(a(a(b,c),d),a(e,f)),g),h) 
etc 

내가 "는 (X, Y)"를 무제한으로 일치합니다. Regex를 사용하여 어떻게 할 수 있습니까? 여기에 내가 가진 무엇 :

\\w\\(((?:\\([a-zA-Z0-9]+\\))|(?:[a-zA-Z0-9]+)),((?:\\([a-zA-Z0-9]+\\))|(?:[a-zA-Z0-9]+))\\) 

그것은 단지 "는 (X, Y)"의 두 가지 재귀를 일치합니다.

답변

6

자바의 표준 정규 표현식 라이브러리는 재귀를 지원하지 않으므로 일반적인 중첩 구문과 일치시킬 수 없습니다. & 교체 패턴 매칭을 할 1) 사용 어휘 분석 -

\w+(?:\((?R)(?:,(?R))*\))? 
+0

파이썬에는 그러한 기능이 있습니까? AFAIK, PHP, .NET 및 Perl 만 이러한 속임수를 사용할 수 있습니다. –

+0

@BartKiers, 맞습니다. 파이썬에는'(? R)'과 친구들이 없기 때문에 어떤 이유로 최신 버전의 정규식 엔진이 그것을 지원한다고 생각했습니다. 목록에서 제거했습니다. – Qtax

+0

파이썬에 익숙하지 않아서 v3에 포함 시켰다고 생각했습니다. –

0

설명하는 언어가 regular language이 아니므로 정규 표현식과 일치 할 수 없습니다.

A (X, Y) = [AZ] ([AZ], [az]와)

정규식 : 나는 당신이 뭔가를 찾고 생각

+9

-1. 정규 표현식 (이 문맥에서)은 정규적이 아니며 25 년 이상되지 않았습니다. – Qtax

+4

Nitpick : 어휘 분석은 정규식을 기반으로합니다. 어휘 분석은 정규 표현식에 의해 정의 된 규칙에 따라 문자 스트림을 기호 스트림으로 변환합니다. 묻는 사람이 묻는 문제를 해결하는 것은 파서 생성기입니다. –

+3

@robert (분명히?) Qtax는 OS-tools/programming API의 정규 표현식을 의미합니다. 그 맥락에서 Regex는 이전에 매치되었던 (그룹화 및 역 참조) 무언가를 매치 할 수있는 능력을 가졌습니다. –

-1

을 (즉 파서를 사용) lexical analysis로 봐 = a (x, y) | a (regex | y) | a (x, regex)

언어로하는 방법을 모릅니다.

+5

...이 답변이 아닙니다. –

0

2 옵션 :

그러나 지원 재귀을 맛 (등 펄, PCRE, .NET)는 같은 표현을 사용할 수있는

[OR] 2) 정규 표현식을 고수하고 싶다면 쉘 프로그래밍 (또는 지원 언어) &을 Java에서 호출하십시오.

0

재귀 정규 표현식을 지원하는 정규 표현식 라이브러리 https://github.com/florianingerl/com.florianingerl.util.regex을 사용할 수도 있습니다! API는 기본적으로 java.util.regex와 동일하지만 필수 import 문은 다릅니다.

Pattern p = Pattern.compile("(?<first>a\\((?<second>(?'first')|[a-zA-Z]),(?'second')\\))"); 
assert p.matcher("a(a(a(a(a(b,c),d),a(e,f)),g),h)").find(); 
관련 문제