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”在第二组。

4

2 回答 2

1

我认为你正在寻找的是这样的:

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

来自“perldoc perlre”:

"(?!pattern)" 一个零宽度的负前瞻断言。例如,“/foo(?!bar)/”匹配任何出现的“foo”,但后面没有“bar”。

我唯一不确定的是 Java 是否支持这种语法,但我认为它支持。

于 2011-09-17T17:15:36.203 回答
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
    }
}
于 2011-09-17T16:28:12.230 回答