2014-11-07 3 views
0

나는 단순히 정적 텍스트로 둘러싼 문자열을 캡처하려고합니다. 예를 들어 설명하겠습니다. 여기에 내가 함께 일하고 있어요 문자열 ... Regex를 사용하여 캡처 그룹 추출

String idInfo = "Any text up here\n" + 
       "Here is the id\n" + 
       "\n" + 
       "?a0 12 b5\n" + 
       "&Edit Properties...\n" + 
       "And any text down here"; 

또는 고급 인쇄에

...

Any text up here 
Here is the id 

?a0 12 b5 
&Edit Properties... 
And any text down here 

입니다 그리고 나는 시도하고 ID 번호를 인쇄하려면 다음 코드를 사용하고 있습니다 .. .

Pattern p = Pattern.compile("Here is the id\n\n\?[a-z0-9]{2}([a-z0-9]{2}){2}\n&Edit Properties...); 
Matcher m = p.matcher(idInfo); 
String idNum = m.group(1); 
System.out.println(idNum); 

내가 원하는 단순히 출력 ID 번호, 그래서이 예를 들어 원하는 출력은 ...

a0 12 b5 

그러나 코드를 실행할 때 "일치하는 항목 없음"예외가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 내 솔루션을 구현하는 더 단순하고 우아한 방법이 있습니까?

답변

2

Matcher를 사용하기 전에 find이 일치해야합니다. 따라서 m.group(1);에 액세스하기 전에 m.find() (또는 목표에 따라 m.matches())을 호출하십시오. 또한 일치 항목이 실제로 발견되었는지 (m.find()이 다시 실행 된 경우 true) 그룹 1이 존재하는지 확인하십시오.

다른 것은 정규 표현식을 나타내는 문자열이 올바르지 않다는 것입니다. ?을 정규식으로 이스케이프하려면 \"\\"으로 작성해야합니다. \은 이스케이프 처리가 필요한 String (예 : \n 작성에 사용됨)의 특수 문자이기 때문에 "\\"으로 작성해야합니다.

마지막으로 언급 한 점은 ([a-z0-9]{2})은 그룹 1에 a0 12 b5과 일치하지 않는다는 것입니다.이 문제를 해결하려면 [a-z0-9]{2}([a-z0-9]{2}){2}을 괄호 안에 묶어야합니다.

그래서 어쩌면

Pattern p = Pattern.compile("Here is the id\n\n\\?([a-z0-9]{2}([a-z0-9]{2}){2})\n&Edit Properties..."); 
Matcher m = p.matcher(idInfo); 

if (m.find()) {//or while(m.find()) 
    String idNum = m.group(1); 
    System.out.println(idNum); 
} 
+0

당신의 코드가 너무 ID 주위 캡처 그룹의 괄호 부족보십시오. 그걸 발견 했어. 나는 그것이 "여기에 id \ n \ n \\입니까? ([a-z0-9] {2} ([a-z0-9] {2}) {2}) \ n & Edit Properties ..." "맞습니까? – user2150250

+0

@ user2150250 네, 맞습니다. 내 코드가 귀하의 질문에 설명 된 결과물을 반환하지 않았다는 것을 놓쳤습니다. 이제 해결되었습니다. – Pshemo