2016-06-10 6 views
1

Java 정규 표현식 라이브러리를 사용하고 있습니다. 다음 형식에 대한 문자열의 유효성을 검사하고 싶습니다.java regex - 반복 그룹 캡처

31,5,46,7,86(...) 

숫자의 양을 알 수 없습니다. 해당 문자열에 적어도 하나의 숫자가 있는지 확인하고 각 두 숫자를 쉼표로 구분합니다. 나는 또한 문자열에서 숫자를 얻고 싶다.

(참고 :이이 사항 String.split 내 실제 문제가 해결되지 않습니다 단지 간단한 예입니다)

나는 다음과 같은 정규식 썼다 :

({[0-9]++)((?:,[0-9]++)*+) 

검증 부품 작품.

Group1: 31 
Group2: ,5,46,7,86 

regex101 버전 : https://regex101.com/r/xJ5oQ6/3

내가 별도로 각 번호를 얻을 수있는 방법이 있나요 내가 번호를 추출 할 때 그러나, 나는이 개 그룹을 얻을? 컬렉션으로 끝나야합니다.

[31, 5, 46, 7, 86] 

미리 감사드립니다.

+0

당신이 그것을 반복적으로 얻을 수있는 당신이 조금 재 작업 및 첫 번째 숫자에 대한 특별한 경우를 추가하는 경우는 다음과 같이 사용할 수 있습니까? – morels

답변

1

자바는 반복 캡처 그룹의 개별 경기에 액세스 할 수 없습니다. 자세한 내용은이 질문을보십시오. Regular Expression - Capturing all repeating groups

Tim Pietzcker가 제공 한 코드는 도움이 될 수 있습니다.

String target = "31,5,46,7,86"; 

Pattern compileFirst = Pattern.compile("(?<number>[0-9]+)(,([0-9])+)*"); 
Pattern compileFollowing = Pattern.compile(",(?<number>[0-9]+)"); 

Matcher matcherFirst = compileFirst.matcher(target); 
Matcher matcherFollowing = compileFollowing.matcher(target); 

System.out.println("matches: " + matcherFirst.matches()); 
System.out.println("first: " + matcherFirst.group("number")); 

int start = 0; 
while (matcherFollowing.find(start)) { 
    String group = matcherFollowing.group("number"); 

    System.out.println("following: " + start + " - " + group); 
    start = matcherFollowing.end(); 
} 

이 출력 :

matches: true 
first: 31 
following: 0 - 5 
following: 4 - 46 
following: 7 - 7 
following: 9 - 86 
0

이 당신을 위해 작동 될 수 있습니다

/(?=[0-9,]+$)((?<=,|^)[0-9]{1,2})(?=,|$)/g 

위의 캡처 입력 , 또는 끝 다음에 하나 개 또는 두 개의 숫자를.

나는 g lobal 수정자를 사용했습니다.

Try it online

+0

이제 캡쳐가 작동하지만 유효성 검사가 아닙니다. 중간에 'no match'대신 문자를 추가하려고했습니다. [this got] (https://regex101.com/r/xJ5oQ6/5) . 당신의 제안은 내가 원한 것에 가장 가깝습니다. –

+0

@RoyMillo 정규식을 업데이트했지만, 동적 길이 lookbehinds가 지원되지 않으므로 원하는 것은 하나의 PCRE 정규식에 넣을 수 없습니다. 나는 자바가 사용하고있는 정규 표현식을 모른다. – andlrc

+0

그러나 여러분의 검증 정규식은 다음과 같이 보일 수 있습니다 :'/^[0-9,] + $ /' – andlrc