2013-10-28 4 views
2

정규식을 사용하여 텍스트 단락의 특정 줄에서 일련의 숫자를 캡처하려고합니다. 아래의 단순화 된 예에서는 "활성 전화 회선"섹션에서 4 자리 숫자를 캡처하려고합니다. 나는 활성 전화 라인의 알 수없는 숫자가 있으리라 믿고있어, 그리고 숫자는 스스로를 반복 할 수 없습니다 :Regex (Back Reference?)로 이전에 캡처 한 그룹 일치

User Names: bob, jill, toni, tom 
Active Phone Lines: 1010, 2020, 3030, 4040, 5050, 6060, 7070 
Inactive Phone Lines: 1111, 2222, 3333, 4444, 5555 

내가 캐리지 리턴/줄 바꿈하여 문자열을 분할하고 단지 ([0-9]{4})의 정규 표현식을 사용할 수 있다는 것을 알고 ,하지만 호기심이 생기고 하나의 정규 표현식을 사용할 수 있는지 알고 싶습니다.

지금까지 나는 다음과 같은 정규식으로 원하는 것을 모두 얻을 수있었습니다 :

(?<=Active Phone Lines: |,)([0-9]{4})(?=, |\rInactive Phone Lines:) 

을하지만 이것은 2222, 3333, 그리고 "비활성 전화 라인"의 4444 캡처합니다. 이전 참조 된 그룹을 참조하기 위해 참조를 사용할 수는 있지만 이전 캡처를 캡처 한 순서가 아닌 참조 된 참조 만 사용할 수 있음을 알 수 있습니다. 같은 수식 내에서만 작동하며 검색을 여러 번 반복하는 것은 아닙니다.

이전에 캡처 한 그룹을 역 참조 할 수있는 방법이 있습니까?

(?<=Active Phone Lines: |$foo,)([0-9]{4})(?=$foo, |\rInactive Phone Lines:) 
+0

Euhm is this java or php? 또한 나는 당신이 원하는 것을 이해하지 못합니다. PHP에서는 다음과 같은 것을 사용할 수 있습니다 ['(test) (this) (? 2) (? 1)'] (http://regex101.com/r/hN3xN7). 이것은'testthisthistest'와 일치합니다 – HamZa

+0

이것은 자바에서 사용될 것입니다. "Active Phone Lines :"문자열 뒤에 "Inactive Phone Lines :"문자열 앞에 나타나는 각 4 자리 숫자를 캡처하는 것이 목표입니다. 문제는 "활성 전화 회선 :"다음에 나타날 수있는 4 자리 숫자가 알려지지 않은 숫자입니다. – dfreer

답변

0

당신은이 같은 \G 앵커를 사용할 수있다 :

(?:Active Phone Lines:|\\G)[\\s,]*([0-9]{4}) 

에서 : $foo 가정하면 그렇게 할 것입니다, 나는 다음 정규식을 사용할 수

Pattern pattern = Pattern.compile("(?:Active Phone Lines:|\\G)[\\s,]*([0-9]{4})"); 
String test = "User Names: bob, jill, toni, tom"+ 
       "Active Phone Lines: 1010, 2020, 3030, 4040, 5050, 6060, 7070"+ 
       "Inactive Phone Lines: 1111, 2222, 3333, 4444, 5555"; 
Matcher matcher = pattern.matcher(test); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 
\G

이전 경기의 끝에서 (그리고 문자열의 시작 부분에서) 일치하지만, 여기에서는 문제가되지 않습니다.

ideone demo