默认情况下,正则表达式使用最长(也叫贪婪)匹配原则.当?紧随其它限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式变成使用最短(也叫非贪婪)匹配原则.
分组组合符就是将正则表达式中的某一部分内容组合起来的符号,反向引用符则是用于匹配前面的分组组合所捕获到的内容标识符号
(1) (pattern)将圆括号中的pattern部分组合成一个可统一操作的组合项和子匹配,每个捕获
的子匹配项按照它们在正则表达式模式中从左到右出现的顺序存储在缓冲区中.缓冲区从1开始编号,最多可存储99个子匹配捕获的内容.存储在缓冲区中的子匹配捕获的内容,可以在编程语言中被检索,也可以在正则表达式中被反向引用.若要匹配字面意义的括号字符"("和")",在正则表达式中要分别使用"\(" 和"\)".
(2) \num匹配编号为num的缓冲区所保存的内容,此处的num是一个标识特定缓冲区的一位或两位十进制正整数,这种方式称为子匹配的反向引用.反向引用最有用的应用之一就是能提供表示相同匹配项的能力,例如,要匹配连续的5个数字字符,可以使用\d{5}作为正则表达式文本,它可以匹配12345,但是, 要匹配连续的5个相同的数字字符,如55555、11111等,需要使用(\d)\1{4}作为正则表达式文本,\1表示与前面(\d)所捕获的内容一样,\1{4}则表示前面的(\d)所捕获的内容还连续出现4次.又例如,要匹配"Is is the cost of of gasoline going up up?"中所有连续重复的单词部分,可以使用/\b([a-z]+)\1\b/gi作为正则表达式文本.
(3) (?:pattern) 将圆括号中的pattern部分组合成一个可统一操作的组合项,但不把这部分内容当作子匹配捕获,即pattern部分是一个非捕获匹配,它匹配的内容不存储在缓冲区中供以后使用.这对必须进行组合、但又不想让组合的部分具有子匹配特点的情况很有用.
(4) (?=pattern)称为正向"预测先行"匹配,在被搜索字符串的相应位置必须有pattern部分匹配的内容,但这部分匹配的内容不作为匹配结果处理,更不会被存储在捕获缓冲区中供以后使用.(?=pattern)必须位于一个正则表达式模式的最前或最后面.
(5) (?!pattern)称为反向"预测先行"匹配,在被搜索的字符串的相应位置不能有pattern部分匹配的内容,除此之外,功能与正向"预测先行"匹配一样.
实例演示
* 简单示例