2017-03-27 4 views
8

입력에이 그룹을 한 번 이상 포함 할 수있는 패턴과 일치하는 그룹을 캡처하고 싶습니다.Regex : 존재하는 경우 하나 이상의 그룹 캡처 (Java)

예 :

input = 12361 randomstuff371 12 Mar 16 138more random381 stuff73f 

내가 "12 3월 16일"을 캡처 할. 이에서

나는 쉽게 정규식을 사용하고 있습니다 :

내 문제는 입력이 이러한 그룹 중 하나 이상을 포함 할 때, 나는 다음 경기를 캡처 할 수 아니에요입니다 그러나
pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}).*"); 

.

예 :

input = randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f 

있도록 :

group 1 = 12 Mar 16 
group 2 = 14 Jan 15 
group 3 = 13 Feb 16 

입력을 통해 작동합니다 정규식이있는 경우이 그룹의 수는 그래서 궁금하네요 항상 달라질 수와 일치하고 이러한 그룹 중 하나 이상을 포함합니다. 나는 시도했다 :

pattern = (".*(\\d{2}\\s\\w+\\s\\d{2}\\s)+.*"); \\ Not sure about whitespace at the end 

그러나 그것은 작동하지 않는다. 이것은 캡처 된 그룹을 저장하는 방법과 관련이 있습니까? 정규 표현식이 많은 입력에 대해 작업해야하기 때문에 필자가 필요로하는 그룹의 수를 미리 결정할 수는 없습니다.

날짜의 전체 세그먼트를 캡처 한 다음 나중에 필요한 그룹 수를 계산하려면 matcher.find()으로 처리하는 것이 좋습니다.

도움이 될 것입니다.

+0

앞뒤의'. * '때문입니다. 그러지 마. –

+0

@James, 당신을 위해 효과가 있다면 답변을 수락하는 것을 고려하십시오. ([SO 응답을받는 방법] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)을 참조하십시오.). –

답변

13

단지 당신의 특정 패턴과 일치 Matcher#find()을 사용하여 얻은 여러 일치로 문자열을 얻을 수 쉬울 것이다 :

String s = "randomstuff371 12 Mar 16 14 Jan 15 13 Feb 16 138more random381 stuff73f"; 
Pattern pattern = Pattern.compile("\\b\\d{2}\\s\\w+\\s\\d{2}\\b"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()){ 
    System.out.println(matcher.group(0)); 
} 

online Java demoregex demo를 참조하십시오.

패턴에 단어 경계를 추가하여 패턴이 전체 단어와 일치하는지 확인했지만 하위 문자열이 다른 텍스트에 붙어 있으면 생략 될 수 있습니다.

관련 문제