2010-03-11 2 views
2

사용자 이름을 정규식과 일치 시키려고합니다. 분할을 제안하지 마십시오. 그룹의Java 정규식이 그룹을 캡처하지 않습니다.

String input = "USERNAME=geo"; 
    Pattern pat = Pattern.compile("USERNAME=(\\w+)"); 
    Matcher mat = pat.matcher(input); 
    if(mat.find()) { 
     System.out.println(mat.group()); 
    } 
왜 찾지

geo :

USERNAME=geo 

여기 내 코드입니까? .group(1)을 사용하면 사용자 이름을 찾습니다. 그러나 group 메서드는 USERNAME=geo을 포함합니다. 왜?

답변

5

group()group(0)과 같고 그룹 0은 전체 패턴을 나타냅니다. documentation에서

: 당신이 당신의 패턴으로, 발견 한 것처럼 표현 m.group(0)m.group()

에 해당하므로

public String group(int group)

그룹 제로, 전체 패턴을 나타냅니다 , group(1) 당신이 원하는 것을 제공합니다.

group()을 사용하고 싶다면 "(?<=USERNAME=)\\w+"과 같은 형식으로 수정해야합니다.

+0

'group()'은 항상 전체 문자열을 반환하지는 않습니다. – incarnate

+0

나는 "전체 패턴"이라고 말하고자했습니다. 수정 됨. – polygenelubricants

+0

실제로 'Matcher' javadoc에 따라 : http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#cg * 그룹 영은 항상 전체 표현식을 나타냅니다. * – BalusC

3

Matcher.group() javadoc은 find()을 호출 했으므로 javadoc에서 이전 일치 항목과 일치하는 입력 부분 시퀀스를 반환하고 사례에서 이전 일치 항목이 'USERNAME = geo'라고 말합니다.

대조적으로 group(int) 메서드는 특정 그룹을 반환합니다. 캡처 그룹은 왼쪽에서 오른쪽으로 여는 괄호를 계산하여 번호가 매겨 지므로 첫 번째 그룹은 귀하의 경우 "지역"과 일치합니다.

1

group인데 그 이유는이 전체 패턴과 일치하는 문자열을 반환하기 때문입니다. 해당 문자열에서 그룹을 얻으려면 원하는 그룹 번호를 전달해야합니다.

아래 부연 세부 사항에 대한 here을 참조하십시오

그룹

공공 문자열 그룹()
이전 성냥으로 일치 한 입력 부분 순서를 돌려줍니다.

공공 문자열 그룹 (INT 그룹)
는 전회의 매치 조작으로 지정된 그룹에 의해 전방 참조 된 입력 부분 순서를 돌려줍니다.
캡처 그룹은 왼쪽에서 오른쪽으로 1부터 시작하여 인덱싱됩니다. 그룹 0은 전체 패턴을 나타내므로 표현식 m.group (0)은 m.group()과 같습니다.

1

따라서 VAR.group (int i)은 i 정규화 된 캡처 그룹을 반환합니다. 0이 전체 문자열입니다. 당신은 당신의 솔루션 (1)

+0

당신의 대답은 괜찮지 만, 앞으로는 다른 응답자들처럼 좀 더 자세히 설명하고 싶을 것입니다. "사람에게 고기 잡이 등을 가르치는 것이 더 낫다." – NomeN

1

을 .group 호출 할 필요가 여기에 작동하는 내용은 다음과 같습니다

public static void main(String[] args) { 
     String input = "USERNAME=geo"; 
     Pattern pat = Pattern.compile("USERNAME=(\\w+)"); 
     Matcher mat = pat.matcher(input); 
     if(mat.find()) { 
      System.out.println(mat.group(1)); 
     } 
    } 

출력 지리적

이유

문자열있는 java.util. regex.Matcher.group (int 그룹)
이전 일치 작업 중 중 주어진 그룹에 의해 캡처 된 입력 서브 시퀀스 을 리턴합니다. 정규의 m, 입력 시퀀스 S 및 기 지수 g, 식 m.group (g) 및 s.substring 들어

(m.start (g) m.end (g)가) 동일 .

관련 문제