2013-03-14 1 views
0

나를 도와 주실 수 있습니까?멀티 매치의 정규식

DrawDate,Ball 1,Ball 2,Ball 3,Ball 4,Ball 5,Ball 6,Bonus Ball,Ball Set,Machine27-Feb-2013,2,24,14,23,20,30,22,6,MERLIN23-Feb-2013,31,25,32,2,30,16,36,5,MERLIN20-Feb-2013,36,45,3,6,44,48,47,8,MERLIN16-Feb-2013,7,27,48,46,39,20,49,6,ARTHUR13-Feb-2013,6,49,23,29,14,20,48,8,MERLIN09-Feb-2013,10,8,34,40,27,41,48,7,MERLIN06-Feb-2013,9,18,10,16,27,42,43,6,ARTHUR02-Feb-2013,2,13,14,21,12,30,39,7,ARTHUR30-Jan-2013,10,9,43,48,47,24,5,5,ARTHUR26-Jan-2013,2,6,21,29,47,34,11,5,ARTHUR 
23-Jan-2013,10,6,32,24,41,14,29,8,MERLIN19-Jan-2013,35,5,9,13,39,16,11,7,ARTHUR16-Jan-2013,13,38,47,12,35,5,45,3,MERLIN12-Jan-2013,3,11,27,24,12,7,13,8,ARTHUR09-Jan-2013,48,39,24,21,5,25,32,6,MERLIN05-Jan-2013,15,37,10,21,17,47,2,5,ARTHUR02-Jan-2013,37,20,30,21,7,9,42,7,MERLIN29-Dec-2012,40,31,6,37,8,48,36,5,GUINEVERE26-Dec-2012,3,11,49,39,47,17,34,6,LANCELOT22-Dec-2012,34,28,4,44,43,14,13,4,LANCELOT 

을 그리고 아래 정규식 사용 :

:

Pattern p = Pattern.compile("(Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)(.*?)(GUINEVERE|LANCELOT|ARTHUR|MERLIN)"); 

Matcher m = p.matcher(result); 

while (m.find()) 
{ 
matchesList.add(m.group()); 
} 

이 내 목록보기에 나와 무엇을 다음과 같이 나는 "결과"다운로드 문자열이

1, Machine27-Feb-2013,2,24,14,23,20,30,22,6,LANCELOT 

2, MERLIN20-Feb-2013,36,45,3,6,44,48,47,8,GUINEVER 

3, ARTHUR13-Feb-2013,6,49,23,29,14,20,48,8,MERLIN 

그러나 정규식 미스 ou t 모든 심지어 라인 :

1, Machine27-Feb-2013,2,24,14,23,20,30,22,6,LANCELOT 

2, 23-Feb-2013,31,25,32,2,30,16,36,5, 

3, MERLIN20-Feb-2013,36,45,3,6,44,48,47,8,GUINEVER 

4, 16-Feb-2013,7,27,48,46,39,20,49,6, 

5, ARTHUR13-Feb-2013,6,49,23,29,14,20,48,8,MERLIN 

6, 09-Feb-2013,10,8,34,40,27,41,48,7, 

이 후 난 무엇을 :

1, 27-Feb-2013,2,24,14,23,20,30,22,6 

2, 23-Feb-2013,31,25,32,2,30,16,36,5 

3, 20-Feb-2013,36,45,3,6,44,48,47,8 

4, 16-Feb-2013,7,27,48,46,39,20,49,6 

5, 13-Feb-2013,6,49,23,29,14,20,48,8 

6, 09-Feb-2013,10,8,34,40,27,41,48,7 

C#"(?s)(?<=Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN).*?(GUINEVERE|LANCELOT|ARTHUR|MERLIN)" 하지만 하지 자바,

I 작동 그물에서 아무 쓸모없는 방법을 시도했습니다. ^$을 시도했지만 어떻게 작동하는지 이해하지 못합니까?

+1

입력 한 샘플 텍스트는 모두 * one * 행에 있지만 나중에 짝수 행마다 정규 표현식이 실패했다고 나와 있습니다. 어떤거야? – kjetilh

답변

0

정규 표현식의 "(machine | GUINEVERE | ...)"부분은 그룹을 캡처합니다. 즉, (1) 결과에 포함되며 (2) 이후에 다음 경기가 으로 시작됩니다.

C# 버전에서는 첫 번째 기계 블록 ("(? < = ...)")에 대해 "0 폭 양의 lookbehind"그룹을 사용합니다. 이제 후행 그룹에 대해 너비가 0 인 긍정적 인 미리보기를 사용해야합니다. 이것은이에 정규식을 변경 :

거의 당신이 원하는 것을
(?<=Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)(.*?)(?=GUINEVERE|LANCELOT|ARTHUR|MERLIN) 

. 출력에서 후미 쉼표 및 선행 공백을 계속 생성합니다. 따라서 정규 표현식을 다음과 같이 변경하십시오.

(?<=Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)\\s*(.*?),?(?=GUINEVERE|LANCELOT|ARTHUR|MERLIN) 

"m.group()"대신 "m.group (1)"에 액세스하십시오. 이렇게하면 "(. *?)"와 일치하는 부분 만 얻을 수 있습니다.

이 특정 예에 대한 대안은

String[] parts = result.split("[\\s,]*(Machine|GUINEVERE|LANCELOT|ARTHUR|MERLIN)[\\s,]*"); 

을하고, 첫 번째 결과를 폐기하는 것 ("DrawDate ...").

+0

안녕하세요 THANKYOU 너무 많이 설명해 주셔서 저에게 완벽하다고 생각합니다. –

+0

그래서? <=는 돌발을 의미합니다. 그리고? = 의미는 바로 그 것인가? –

+0

@ user2070354 : "Pattern"클래스의 API 문서를 참조하십시오. http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html. 여기에는 구문에 대한 설명이 포함되어 있습니다. – creinig

관련 문제