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番目のグループに含まれる必要があります。

4

2 に答える 2

1

私はあなたが探しているものは次のようなものだと思います:

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

「perldocperlre」から:

"(?! pattern)"ゼロ幅の負の先読みアサーション。たとえば、「/ foo(?! bar)/」は、「bar」が後に続かない「foo」の出現に一致します。

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

于 2011-09-17T17:15:36.203 に答える
0

matchesの代わりにを使用するfindと、文字列全体をそのパターンと照合しようとします。これmadは、2番目のグループに入れることによってのみ実行できます。

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
    }
}
于 2011-09-17T16:28:12.230 に答える