前瞻后顾
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
前瞻(Lookahead)和后顾(Lookbehind)
正则表达式引擎是从文本头部向尾部开始解析的(可以设置解析方向),
因此文本尾部的方向,称为“前”(正则引擎还没解析),
而对文本头部方向,称为“后”,(正则引擎已经解析)
所谓的前瞻就是在正则表达式匹配到某个字符的时候,往“尚未解析过的文本”预先看一下,看是不是符合/不符合匹配模式,
而后顾,就是在正则引擎已经匹配过的文本看看是不是符合/不符合匹配模式。
肯定式匹配(positive)和否定式匹配(negative)
符合和不符合特定匹配模式我们又称为肯定式匹配(positive)和否定式匹配(negative)。
肯定式匹配时则当符合特定模式时停止,否定式匹配则当不符合特定模式时停止。
贪婪型量词、勉强型量词、占有型量词
文本:
<p>first</p> yeah
贪婪型量词正则表达式
<.*>
匹配<p>first</p>
勉强型量词正则表达式
<.*?>
匹配<p>
文本:
<p>one</p> two
占有型量词正则表达式
<.*+>
无匹配结果
当引擎发现.的重复次数达到最大了,引擎读取了之后的>,发现匹配不了,这时引擎知道重复最大次数是不行的,然后整个匹配就失败了,引擎不会去尝试其他的重复次数。
占有型量词正则表达式
<[^>]*+>
匹配<p>
当引擎发现[^>]的重复次数达到最大了,引擎读取了之后的>,发现匹配了
占有型量词可以提高匹配的效率,因为它不会遍历所有可能性去匹配一段字符串,它只匹配重复次数最大的那种可能,行就行,不行就不行。如果我们需要的结果只有在最大重复次数时才会出现,那其余的尝试都是不必要的。
比如,我们要得到文本<p>one</p> two中每对尖括号包裹的内容,那我们可能会用<.*?>,但我们也可以用表达式<[^>]*+>。后者效率更高,因为它不用尝试其他的可能性。
replaceAll 和 appendReplacement
http://my.oschina.net/shipley/blog/98973
参考
正则基础之——NFA引擎匹配原理
https://blog.csdn.net/lxcnn/article/details/4304651
使用正则表达式找出不包含特定字符串的条目
http://www.imkevinyang.com/2009/08/使用正则表达式找出不包含特定字符串的条目.html
正则表达式中的量词
https://www.jianshu.com/p/1706e594f7c7
JAVA 正则表达式
http://blog.csdn.net/allwefantasy/article/details/3136570/
正则表达式全部符号解释
http://www.cnblogs.com/yirlin/archive/2006/04/12/373222.html
浅析正则表达式—(原理篇)
https://www.cnblogs.com/dwlsxj/p/3532458.html
深入入门正则表达式(java)
http://blog.csdn.net/su1216/article/details/8662027
正则表达式
http://blog.csdn.net/shangboerds/article/details/7632217