2017-01-16 1 views
2

정규 표현식을 사용하여 일치하는 부분을 버리는 방법은 무엇입니까?Regex - 일치를 버리는 법

public class main { 
    public static void main(String[] args) { 
     Pattern pattern = Pattern.compile("(?<=b)([xyz])(?:a*?)c"); 
     String string = "abyaacbxaaac"; 
     Matcher matcher = pattern.matcher(string); 
     while(matcher.find()){ 
      System.out.println(matcher.group()); 
     } 
    } 
} 

출력은 여기에 있습니다 :

yaac 
xaaac 

내가 출력을 원하는 경우에만 y 내가 실행 xSystem.out.println(matcher.group());
즉, 일치하는 것을 폐기합니다. (?:a*?)

P.

는 내가 자신에 xy를 얻을 수 matcher.group(1)을 사용할 수 있습니다 알고 있지만 난 단지 특정 그룹에 액세스 할 필요없이 출력 xy에 전체 경기를하고 싶습니다.

+1

"Discard"는 "한 번의 일치 작업 내에서 텍스트의 불연속 부분을 찾습니다"를 의미합니다. 그것은 당신이 lookaround에 의지 할 수있을 때 가능하지 않습니다. 또는 그룹 캡처 및 추가 사후 처리. 또는 교체 방식을 사용합니다. –

답변

4

당신은 당신이 경기에 필요한 부분 만 얻을 수 있도록 정규식에 lookarounds를 사용할 수 있습니다

(?<=b)[xyz](?=a*c) 

RegEx Demo

(?=a*c) 우리가 0 이상 a은 다음이 주장하는 긍정적 예측이다 c 앞서. 이것은 너비가 어설 션이므로 0과 일치하므로 [xyz] 문자 중 하나입니다.

+1

정말 빠릅니다. 하하하 +1. 나는이 글을 쓰고 있었다.^_^ –

+0

이것이 내가'x'와'y'를 주겠지 만 그것이 정말로 내가 원하는 것은 아니다. 나는 특히 경기의 일부를 버릴 수있는 방법이 있는지 알고 싶다. – sudoman

+0

파문이 성냥과 거의 반대라는 것을 이해하길 바랍니다. lookaheads를 사용하는 자바에서는 매칭없이 단언 할 표준 방법입니다. PCRE의'\ K'조차도 앞선 텍스트가 아니라 이전에 매치 된 텍스트를 쉬게합니다. – anubhava

관련 문제