正则表达式复习
简单模式匹配
1. 数字
a. [0-9]
b. \d
2. 非数字
a. \D
b. [^0-9]
c. [^\d]
3. 单词
a. \w
b. [_a-zA-Z0-9]
4. 非单词
a. \W
b. [^_a-zA-Z0-9]
c. [^\w]
5. 空白
a. \s
b. [ \t\n\r] 空格 制表 换行 回车
6. 非空白
a. \S
b. [^ \t\n\r]
c. [^\s]
7. 匹配单词边界
a. \b 不消耗任何字符
8. 匹配任意字符
a. . 点号可以匹配除行结束符之外的所有字符
b. .* 0个或多个
c. .+ 1个及以上
边界
1. \b 单词边界
2. \B 非单词边界,eg. \Be\B 匹配单词中间的e,e不能出现在开头和结尾
3. ^ 行开始,脱字符(U+005E)。^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。而上下文则依赖于应用程序和在应用程序中所使用的选项
4. $ 行结束
选择、分组和后向引用
1. | 或 eg. "The THE the", "(the|The|THE)" 匹配三个单词
2. \1 或 $1 引用第一组,\2引用第二组
3. 原子分组(atomic group) (?>pattern) 用于组内停止回溯,原子分组主要与性能相关 原子分组 (regular-expressions.info)
a. 灾难性回溯 eg. "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy" "(x+x+)+y"
b. .NET 正则表达式中的回溯 https://docs.microsoft.com/zh-cn/dotnet/standard/base-types/backtracking-in-regular-expressions
c. (.net)如果正则表达式依赖回溯,建议你始终设置超时间隔。"abc" a(bc|b)c 匹配 abc a(?>a(bc|b)c 则不匹配
4. (?:subexpression) 不引用分组,\1 \2 引用会排除掉 ?: 的分组
字符组
1. [] bracketed expression
2. [0-9]
3. [a-zA-Z]
4. [\w\s] 等同于 [_a-zA-Z \t\n\r]
5. 取反 ^ [^aeiou] 不匹配元音字符
6. 并集或差集
a. 并集[0-3[6-9]]
b. 差集[a-z&&[^m-r]]
Unicode
1. \uxxxx 匹配Unicode 字符,xxxx为码点
量词
1. ? 零或1个
2. + 1个及以上
3. * 零个或多个
4. 这些量词默认都是贪心(greedy)的
5. {n} 或{n,m} 匹配范围次数
6. 懒惰量词 ? 在以上量词后加一个? ,匹配最少次数
7. 占有(possessive)量词 +在以上量词后加一个+ ,匹配最多次数,但不会进行回溯(.net 不支持)
环视
1. 正前瞻(正预测先行断言) (?=subexpression)
a. (?i)ancyent(?=marinere) 忽略大小写,找到 marinere前面的 ancyent
2. 反前瞻 (负预测先行断言)(?!subexpression)
a. (?i)ancyent(?!marinere) 忽略大小写,找到不是 marinere在前面的 ancyent
3. 正后顾(正回顾后发断言)(?<=subexpression)
a. (?i)(?<=ancyent)marinere 忽略大小写,找到前面是 ancyent的marinere
4. 反后顾(负回顾后发断言)(?<!subexpression) (?i)(?<!ancyent)marinere 忽略大小写,找到前面不是 ancyent的marinere
主要参考资料《学习正则表达式》