到处逛博客想找正则优化的办法,发现挺多博客提高这本书,大同小异都是从《精通正则表达式》的第6章总结起来的,很有意义拜读一下。
第3版电子书资源都是从网络上下载过来的
非扫描版,排版不太好,来自linux公社https://pan.baidu.com/s/14PJts0LFJA7FrzUsaQoCTw
扫描版,来自java1234.comhttps://pan.baidu.com/s/1jLSi-sgxUGCkfh_ZWwfZog
第1-3章 正则入门、示例、特性
子表达式:指的是整个正则表达式中的一部分,通常是括号内的表达式,或者是由「|」分隔的多选分支。
字符组
字符[···]里的连字符-必须放在字符组的开头,保证它是一个普通字符,而不是用来表示范围;
排除型字符组[^···] 可以匹配换行符;
\w 包括数字、字母和下划线,[a-zA-Z0-9_]
\W 等价于\[^\w]
\s 包括空格符、制表符、换行符和回车符
\S 等价于\[^\s]
\b 等价于(?<!\w)(?=\w)|(?<=\w)(?!\w)
\d 数字,[0-9]
\D 某个不是数字的字符,\[^\d]
字符组集合运算:
OR:[[abc][def]]等价于[abc[def]]、[[abc]def]、[abcdef]
AND:[[a-z]&&[^aeiou]] 小写非元音字母的字符组
Unicode属性
基本属性
\p{L} 字母
\p{M} 不能单独出现,而必须与其他基本字符一起出现(重音符号、包围框等)
\p{Z} 用于表示分割,但本身不可见的字符(各种空白字符)
\p{S} 各种图形符号和字母符号
\p{N} 任何数字字符
\p{P} 标点字符
\p{C} 匹配其他任何字符(很少用于正常字符)
复合子属性
量词
匹配优先量词:*、+、?、区间{min,max}
忽略优先量词(懒惰模式):*?、+?、??、{num,num}? 匹配尽可能少的内容
占有优先量词:*+、++、?+、{num,num}+ 一旦匹配,不会交还,可以用固化分组模拟,如.++与?>.+
锚点
环视结构
环视结构属于复杂锚点,不匹配任何字符,只匹配文本中的特定位置,这一点与单词分界符「\b」、锚点「^」和「$」相 似。但是,环视比它们更加通用。
为什么不在最终匹配的结果中包含顺序环视匹配过的文本呢?通常,这是因为我们希望在表达式的后面部分,或者在稍后应用正则表达式时,再次检测这段文本。
(?=···)肯定型顺序环视:从左至右查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息
Pattern pattern = Pattern.compile("(?=Jeffrey)Jeff");
Matcher matcher = pattern.matcher("by Jeffrey Friedl");//Jeff
Matcher matcher1 = pattern.matcher("by Jefferson Friedl");//无结果
(?<=···)肯定型逆序环视:从右向左查看文本
s/Jeffs/Jeff's/g
s/\bJeffs\b/Jeff's/g
s/\b(Jeff)(s)\b/$1'$2/g //只增加了复杂度
s/\bJeff(?=s\b)/Jeff'/g
s/(?<=\bJeff)(?=s\b)/'/g
s/(?=s\b)(?<=\bJeff)/'/g //调换环视顺序不影响结果
(?!···)否定型顺序环视:从左至右查看不匹配
(?<!···)否定型逆序环视:从右向左查看不匹配