三、正则表达式高级
1. 后向引用
(exp) 匹配exp,并捕获文本到自动命名的组里,命名规则为从左向右、从1开始依次分组,分组0对应整个正则表达式
/n 重复搜索前面分组n匹配的文本
例如 /b(/w+)/b/s+/1/b,编号为1的分组为/b(/w+)/b,表示一个单词,整个表达式用来匹配重复的单词,像go go, 或者kitty kitty。
(?<name>exp) 匹配exp,并捕获文本到名称为name的分组里,也可以写成 (?'name'exp)
/k<name> 调用名为 name 的分组
例如上面的例子也可以写成 /b(?<Word>/w+)/b/s+/k<Word>/b。
2. 零宽断言
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
例如 (?<=/bre)/w+/b,匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
3. 负向零宽断言
(?<!exp) 匹配前面不是exp的位置
(?!exp) 匹配后面跟的不是exp的位置
例如 /b/w*q(?!u)/w*/b,匹配单词里包含q字母且q字母后不跟u字母的字符串,以q字母结尾的字母也可匹配。(若用 /b/w*q[^u]/w*/b,如果q是单词的最后一个字符的话,后面的[^u]将会匹配q后面的单词分隔符,后面的/w*/b将会匹配下一个单词,于是 /b/w*q[^u]/w*/b 就能匹配整个Iraq fighting。)
4. 注释
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读
要包含注释的话,最好是启用"忽略模式里的空白符"选项,这样在#后面到这一行结束的所有文本都将被当成注释忽略掉。
5. 贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是匹配尽可能多的字符,称为贪婪匹配。有时需要匹配尽可能少的字符,称为懒惰匹配。
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
例如对于aabab,a.*b 会匹配整个字符串aabab;a.*?b 会匹配aab和ab。(最先开始的匹配拥有最高的优先权,所以第一个匹配是aab而不是ab。)
四、常用正则表达式
1. 给长串数字加分隔符(例 1,000,000) ((?<=/d)/d{3})+/b
2. log 文件内容(格式为 04:03:27 127.0.0.0 Hello world) @"(?<time>(/d|/:)+)/s(?<ip>(/d|/.)+)/s(?<site>/S+)"
3. 十六进制表达式 /b[0-9a-fA-F]+/b