2012-10-23 2 views
2

나는 다음과 같은 문자열을 가지고있다 : obj[attr1=val1 attr2=val2 attr3=val3]
개체 이름과 속성을 추출해야한다.자바 정규 표현식 : 그룹 수 고정

Pattern pathPattern = Pattern.compile("^(\\w+)(?:\\[(\\w+=\\w+)(?:\\s+(\\w+=\\w+))*\\])?$"); 

난 그냥 객체 이름과납니다 :

/^(\w+)(?:\[(\w+=\w+)(?:\s(\w+=\w+))*\])?$/ 

가 지금은 문제가 자바에서 결정이 :

이전, 나는 다음 정규 표현식을 사용하여 자바 스크립트에 유사한 작업을 결정했습니다 첫 번째 특성. Mather 클래스는 심볼 "*"을 고려하지 않고 "()"의 카운트에 대응하는 그룹 수를 얻는 것 같습니다.

js regexp처럼 java reg reg를 만들 수 있나요, 아니면 두 단계 추출을해야합니까?

+0

네 말이 맞아요. '*'에 매치되는 모든 것을 고려하지 않습니다. 그러나 단지 한 그룹 수입니다. –

+0

나는 그것이 이상한 실현 방법이라고 생각한다. 일치하는 데 reg exp 사용할 수 있지만 데이터를 사용할 수 없습니다. – Damask

+0

'*'를 사용하면 패턴은 다음 일치 항목으로 계속 교체됩니다. 그러므로 마침내 일치하는 문자열이 하나뿐입니다. 그래서 그 유일한 그룹입니다. –

답변

4

Matcher.groupCount()에만 개방 브래킷의 수를 계산 감사하고 그룹 수를 고려한다. 그러므로, 당신이 여는 대괄호의 수는 그룹 수의 숫자가 될 것입니다. 이 모든 attr=val[] 내부 일치합니다

Pattern pattern = Pattern.compile("(?:\\b)(\\w+?)=(\\w+?)(?:\\b)"); 
Matcher matcher = pattern.matcher(str); 

while (matcher.find()) { 
    System.out.println(matcher.group(1) + " : " + matcher.group(2)); 
} 

- :

당신은 [.*] 내부의 값을 얻기 위해 아래의 패턴을 사용할 수 있습니다.

OUTPUT : -

attr1 : val1 
attr2 : val2 
attr3 : val3 

UPDATE : - 당신은 당신의 위의 문자열의 경계 확인을 할 필요가 없기 때문에

, 위의 패턴도에 단순화 할 수있다 : -

Pattern pattern = Pattern.compile("(\\w+?)=(\\w+)"); 
+0

이 방법은 두 단계의 결정을 가정합니다. 나는 그것을 한 걸음 내딛는 것이 흥미 롭다. Java RegExp처럼 보이지 않습니다. – Damask

+0

@BulatSafin. 의미에서 2 단계 결정? 나는 이해할 수 없다. –

+0

첫 번째 : 개체 이름과 괄호 내용을 추출하십시오. 두 번째 : 대괄호 내용을 파싱합니다. – Damask