2011-09-17 6 views
2
Pattern p = Pattern.compile("(ma)|([a-zA-Z_]+)"); 
Matcher m = p.matcher("ma"); 
m.find(); 
System.out.println("1 " + m.group(1) + ""); //ma 
System.out.println("2 " + m.group(2)); // null 
Matcher m = p.matcher("mad"); 
m.find(); 
System.out.println("1 " + m.group(1) + ""); //ma 
System.out.println("2 " + m.group(2)); // null 

しかし、文字列「mad」が2番目のグループに含まれる必要があります。パターン先読み

答えて

1

私はあなたが探しているものだと思います"はperldocはperlre" から

(ma(?!d))|([a-zA-Z_]+) 

のようなものであるため3210

"(?!パターン)" ゼロ幅の負の先読みアサーション。 の場合 "/ foo(?!bar)/"は ではない "foo"の任意の出現と一致し、その後に "bar"が続きます。

Javaがこの構文をサポートしているかどうかはわかりませんが、私はそう考えています。

0

あなたがmatches代わりのfindを使用している場合は、それが唯一の第二のグループにmadを置くことによって行うことができ、そのパターンに対して、文字列全体にマッチしようとします:

import java.util.regex.*; 

public class Test { 
    public static void main(String[] args) { 
     Pattern p = Pattern.compile("(ma)|([a-zA-Z_]+)"); 
     Matcher m = p.matcher("ma"); 
     m.matches(); 
     System.out.println("1 " + m.group(1)); // ma 
     System.out.println("2 " + m.group(2)); // null 
     m = p.matcher("mad"); 
     m.matches(); 
     System.out.println("1 " + m.group(1)); // null 
     System.out.println("2 " + m.group(2)); // mad 
    } 
} 
+0

私の状況では私はマッチを使用することはできません。私は私のパターンで先を見せる何かが必要だと思う。 – itun

+0

'(ma)$ |([a-zA-Z _] +)$'を使用できますか?それは再び文字列の最後まで来るように強制し、 'find'はまだ動作します。 –

+0

私の仕事では長い文字列がありますが、どこにこのパターンの字句がたくさんあるのですが、それはなぜ一致しないものを使用するのかです。 – itun

関連する問題