模式前瞻

时间:2011-09-17 16:22:27

标签: java regex regex-lookarounds

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 个答案:

答案 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
    }
}