最近在学习正则表达式,确实是略难呀,下面就几个不甚理解的点做了点笔记。
1. 为什么要添加^$?
答:加^$的话就代表把整个要匹配的字符串当成一个整体做一次匹配,而不加则一个字符串可以匹配多次,只能代表这个字符串中有符合条件的并不代表改字符串符合条件。
例子:
test: <h> <h2> <h> <h> <h> <h>
regex1:<h>
result1: <h> <h2> <h> <h> <h> <h>
regex2:^<h>$
result2: <h> <h2> <h> <h> <h> <h>
2.为什么(hh+)\1+和^(hh+)\1+$对于hhhhhhhhh(9个h)匹配结果不一样?
答:正则表达式匹配存在回溯,其匹配存在顺序,前者不是针对整个表达式进行最优匹配,得到解即可;后者由于要匹配整个表达式,所以必然要得到最优解。查看匹配过程即可知。
前者匹配过程: 后者匹配过程:
hhhhhhhhh 最大程度满足(hh+) 前几步同,但是当满足前者匹配完成的条件时,后者仍无法匹配成
backtrack 不满足/1+ 功,因为是对整个表达式匹配,必须全部满足条件
hhhhhhhh 最大程度满足(hh+) hhhh 最大程度满足(hh+)
backtrack 不满足/1+ backtrack 不满足/1+
以此类推,直到 hhh 最大程度满足(hh+)
hhhh 最大程度满足(hh+) hhhhhhhhh 满足/1+,匹配成功
hhhhhhhh 满足/1+,匹配成功
3.\1的作用是什么?
答:\1配合()使用,表示为()内匹配成功的内容,又名后向引用。乍一看好像没什么用处,下面用一个例子表示其区别:
对于正则表达式(ab+){2,}和(ab+)\1+,前者实际表示的是(ab+)(ab+)(ab+)...,而后者表示的是(ab+)[前面匹配的内容][前面匹配的内容][前面匹配的内容]...,具体表现为前者可以匹配abbbababbabbbbbb,而后者只能匹配abbabbabbabbabb。
4.关于?:所起到的非获取匹配是什么?以及正向预查、负正向预查、反向预查、负反向预查是什么?
答:在此博文中有详解。http://yimi128.iteye.com/blog/1436659