正则表达式复习

简单模式匹配

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

主要参考资料《学习正则表达式》

posted @ 2021-09-03 09:55  大廖  阅读(74)  评论(0编辑  收藏  举报