2017-01-16 5 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.S.

は、私は自分自身でxyを取得するためにmatcher.group(1)を使用することができます知っているが、私は唯一の特定のグループにアクセスすることなく出力xyにマッチ全体をしたいと思います。

+1

「捨てる」とは、「1回のマッチ操作でテキストの不連続部分を一致させる」という意味です。それはあなたがルックアラウンドに頼ることができるとき、それは不可能です。またはグループをキャプチャし、さらに後処理します。または、置換アプローチを使用します。 –

答えて

4

あなたが試合で必要な部分だけを得るためにあなたの正規表現で前後参照を使用することができます。

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

RegEx Demo

(?=a*c)たちは0以上aが続いていることを主張する肯定先読みでありますc先。これは幅がゼロのアサーションであるため、一致はまだ[xyz]のいずれかになります。

+1

あなたはとても速いです。ハハハ+1。私は書いていました^ _^ –

+0

これは私に 'x'と' y'を与えてくれると思いますが、私が探しているものではありません。私は具体的には、マッチの一部を破棄する方法があるかどうかを知りたいと思います。 – sudoman

+0

あなたは破棄がほぼ一致していることを理解したいと考えています。ルックアヘッドを使用するJavaでは、マッチングせずにアサーションを実行する標準的な方法です。 PCREの '\ K'でも、前に一致したテキストだけを前方のテキストではなく残ります。 – anubhava

関連する問題