2014-04-24 3 views
0

문자열에서 두 단어 사이의 단어 그룹을 일치 시키려고합니다. 나는 자바 RegEx를 사용할 것이다.RegEx는 단어 집합 사이의 문자열을 일치시킵니다.

입력 텍스트

The clever fox JUMPED OVER the big dog and ran away. 

예상 출력

the big 

사용 정규식

(?<=(fox\s[A-Z0-9]*))(?s)(.*?)(?=\sdog) 

나는 나에게 여우와 개 사이의 모든 단어를 제공 출력 이하로 얻을

JUMPED OVER the big 

은 "여우가" 항상 하나 이상의 모든 대문자 단어 다음됩니다 단어. 이 두 단어 다음에 오는 모든 단어를 일치시킬 때까지 "dog"이 나옵니다.

또한 캡처 그룹 0에서 원하는 결과를 얻으려고합니다. 다른 캡처 그룹을 사용할 수 없습니다. 이것은 내 응용 프로그램의 제한 사항입니다.

이 문제에 대한 도움을 주시면 감사하겠습니다.

+0

"두 단어 사이의 단어 그룹". 이 두 단어는 무엇입니까? –

+0

@Tichodromamuraria 예제 문자열에서 단어 "fox JUMPED OVER"와 "dog"사이의 모든 단어가 필요합니다.내 영어를 용서해주십시오. 이것들은 2 단어 이상입니다. – immzi

+0

저는 이미 지루합니다 ... –

답변

1

나는 두려워하는 자바 doesn't support variable length look behind assertions입니다.

가변 길이 lookbehind가 허용되지 않는 (앞에서 설명했듯이) 이유로 인해 특정 길이의 대문자 단어가 항상 있음을 알지 못하면 불가능합니다.

캡처 그룹 1 시도와 함께이 작업을 수행하려면

(?<=fox)(?:\s[A-Z0-9]*)*\s?(.*?)(?=\sdog) 

편집 : 고정 오타

편집 2 정규식

에서 : 명확히 전체 텍스트 문제.

편집 3 : 어리석은 java가 "lookbehind 그룹의 명확하지 않은 최대 길이"에 따라 작동 할 수도 있습니다. (?<=fox(?:\s[A-Z0-9]{5,7}){1,2})(.*?)(?=\sdog)하지만이 질문을 통해 그룹 0을 캡처해야하는 이유가 무엇인지 묻고 싶습니다. 나는 다소 의문의 여지가있다. 출력을 가져 와서 .*에 대해 다시 실행하면 캡처 그룹 0의 정규식을 얻을 수 있지만 실제로이 요구 사항을 필요로하는 방법은 없다. 정규 표현식없이

+0

네, 캡쳐 그룹 1에서 원하는 텍스트를 얻을 수있었습니다.하지만 전체 텍스트 즉, 그룹 0이 필요합니다. 또한 정규 표현식을 사용하려고했는데, 그것은 내게주는 것이 아닙니다. 캡처 그룹의 원하는 텍스트 1. 여기에 아무것도 없는지 확실하지 않습니다. RegExes에 대한 지식이 부족합니다. 가변 길이보기에 대해 경고 해 주셔서 감사합니다. – immzi

+0

가변 길이 lookbehind 허용되지 않기 때문에 내가 말했듯이 캡쳐 그룹 0에 전체 텍스트를 가져 오는 것은 불가능합니다. 죄송합니다. 지금 정규식에 오타가있었습니다. –

+0

대문자 단어의 최소 및 최대 문자를 가질 수 있다고 생각합니다. 그게 도움이 될 수 있니? 예를 들어 내 대문자 단어는 최소 5 자 및 최대 7 자의 문자를 갖습니다. – immzi

0

: 당신이 다른 경우에 사용하는 함수에서 매개 변수에 의해 foxdog를 전달할 수

^.*fox[A-Z0-9\s]*(.*)dog.*$ 

:이 정규식을 사용할 수 있습니다

String fox = "The clever fox JUMPED OVER the big dog and ran away."; 

    boolean start = false; 
    for (String word : fox.split("\\s")) { 
     if ("fox".equals(word)) { 
      start = true; 
      continue; 
     } 
     if ("dog".equals(word)) { 
      break; 
     } 
     if (start) { 
      System.out.println(word); 
     } 
    } 
+0

정규 표현식으로 필요합니다. 일치시켜야하는 정확한 단어를 받아들이는 다른 응용 프로그램에이 코드를 제공해야합니다. RegEx를 사용하여 제게 뭔가 제안 해 주시겠습니까? – immzi

1

.

+0

이렇게하면 그룹 1에서 일치하는 단어를 얻을 수 있습니다. 그룹 0에서 얻을 수있는 방법이 있습니까? 답을 많이 주셔서 감사합니다 – immzi

+0

'(. *)'를'(? =)로 변경하면 그룹 무시 구문을 사용할 수 있습니다. . *)'. 이렇게하면 정규 일치자가 그룹을 무시할 수 있습니다. – maxdev

+0

변경 사항을 수행 한 후 @maxdev를 입력하십시오. RegEx는 다음과 같이 보입니다 ^. * 여우 [A-Z0-9 \ s] * (? =. *) 개. * $ – immzi

관련 문제