정규식 일치 후 다음 텍스트 가져 오기


84

저는 Regex를 처음 사용하고 튜토리얼을 살펴 봤지만 원하는 작업에 적용되는 것을 찾지 못했습니다.

나는 무언가를 찾고 싶지만 그 뒤에 오는 모든 것을 반환하지만 검색 문자열 자체는 반환하지 않습니다.

예 : " 굉장한 절름발이 문장 "

" 문장 " 검색

return " 정말 멋져요 "

어떤 도움이라도 대단히 감사하겠습니다.

이것은 지금까지 내 정규식입니다.

sentence(.*) 

하지만 반환 : 굉장한 문장

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}

실제 전화는 무엇입니까? 사용하고 Matcher있습니까?
Grzegorz Oledzki

나는 정규 패턴 사용하고 있습니다
스콧

... 그리고 무엇이 잘못되었는지 평가하는 데 도움이되도록 실제 Java 코드를보고 싶습니다.
Steve Jorgensen

System.out.println("I found the text: " + "some lame sentance that is aweomse".substring(end()));
Nishant

3
@DavidIsNotHere 나치는 ... 자본 N을 가져야한다
리 테일러에게

답변:


135

주석에서 요청한대로 "정규 표현식 만"으로이를 수행 할 수 있습니다.

(?<=sentence).*

(?<=sentence)A는 긍정적 인 lookbehind 주장은 . 이것은 문자열의 특정 위치, 즉 sentence해당 텍스트 자체를 일치의 일부로 만들지 않고 텍스트 바로 뒤의 위치 에서 일치합니다. 결과적으로 (?<=sentence).*sentence.

이것은 정규식의 아주 좋은 기능입니다. 그러나 Java에서는 유한 길이 하위 표현식에 대해서만 작동합니다. 즉 (?<=sentence|word|(foo){1,4}), 합법적이지만 (?<=sentence\s*)그렇지 않습니다.


긍정적 인 lookbehind 주장을 포함해서는 안된다고 말합니다. 그래서 ". * (? <= sentence)"는 "sentence"를 포함하지 않고 모든 것을 반환해야한다고 가정합니다. 그러나 그렇지 않고 "문장"도 반환합니다. 내가 무엇을 놓치고 있습니까?
JJJones_3860

@ user2184214 : 그것은 주장 뒤에 있는 모습이기 때문 입니다. .*모든 텍스트와 일치 한 (?<=...)다음 단어를 뒤로 sentence검색하여이 경우 일치가 해당 단어로 끝남을 확인합니다. 그 단어 앞에 멈추고 싶다면 을 봐야합니다 : .*(?=sentence)는 뒤에 오는 모든 텍스트와 일치합니다 sentence.
Tim Pietzcker

17

귀하의 정규식 "sentence(.*)"이 맞습니다. 괄호 안의 그룹 내용을 검색하려면 다음을 호출합니다.

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

m.find()이 경우 의 사용 (문자열의 아무 곳이나 찾으려고 시도)이 아니라 m.matches()( "some lame"접두사 때문에 실패합니다.이 경우 regex는 여야 함 ".*sentence(.*)")


감사합니다,하지만 난 그냥 "굉장하다"반환 할 경우 어떻게
스콧

감사합니다, 이것은 훌륭하게 작동했습니다. 정규 표현식만으로이 작업을 수행하는 방법이 있기를 바랐습니다. 그런 방식으로 수행하는 방법을 찾을 수 없다면 이것도 잘 작동 할 것입니다
Scott

성능을 위해 정규 표현식 끝에 "(. *)"를 추가하는 것이 좋지 않을 수 있습니다.
eregon

8

Matcher가로 초기화 str되면 매치 후 매치 후 부품을 얻을 수 있습니다.

str.substring(matcher.end())

샘플 코드 :

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

산출:

굉장하다


matcher.find()이 전에 IMO가 필요합니다.
Nishant

@Nishant는 내가 쓴 "경기 후"입니다. 설명을 위해 샘플 코드 추가
Sean Patrick Floyd

1

matcher 의 group (int) 을 사용해야합니다. group ( 0)은 전체 일치이고 group (1)은 표시 한 첫 번째 그룹입니다. 지정한 예에서 group (1)은 " sentence " 뒤에 오는 것 입니다.


1

다음 줄에 "group ()"대신 "group (1)"을 입력하면 예상 한 결과가 반환됩니다.

System.out.println("I found the text: " + matcher.group(**1**).toString());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.