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”出现在第二组中。
答案 0 :(得分:1)
我认为你所寻找的是:
(ma(?!d))|([a-zA-Z_]+)
来自“perldoc perlre”:
“(?图案)” 零宽度负前瞻断言。对于 例 “/ foo(?!bar)/”匹配任何“foo”的出现 不 接着是“酒吧”。
我唯一不确定的是Java是否支持这种语法,但我认为确实如此。
答案 1 :(得分: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
}
}