正则表达式中出16.1小节所介绍的那些通配符外,还有贪婪模式、非贪婪模式、定位符、正反向预搜索、反向引用等概念,这些概念都属于正则表达式高级语义的范畴,使用高级语义能够定义出更为更为形式复杂的正则表达式,本小节将详细讲解正则表达式的高级语义。
16.1.4小节中曾经介绍过:如果定义了某类字符出现的次数,那么表达式引擎在完成匹配时会尽量以更多的字符完成匹配,例如:
String str = "axxxaaxxxa";
String result = str.replaceAll("a.+a","*");
以上代码希望把str中“以a开头并以a结尾”的一串字符替换为一个“*”,str中的“axxxa”的符合匹配条件,而str整个字符串也符合匹配条件,这种情况下表达式引擎会匹配str整个字符串,因此以上代码运行的结果是把str整体替换为一个“*”,这种尽量多匹配字符的匹配方式在专业上被成为“贪婪模式”。
实际上,正则表达式也可以用“非贪婪模式”完成匹配。所谓“非贪婪模式”就是指在完成匹配时尽量以更少的字符完成匹配,程序员只需要在表示出现次数的符号后面写一个?就可以。下面的【例16_10】对比了贪婪模式和以非贪婪模式匹配的效果。