正则表达式

正则表达式: 用来描述符合某种模式(具有某种特征)的一类字符串的表达式.

正则表达式的组成

  • 普通字符: 即普通的字符 (如abcd!@#$等等,这个不需要介绍)
  • 元字符: 具有特殊描述功能的字符 (如.*1|等等,重点是这个)

元字符

元字符主要有以下几类

1.特殊字符(不显示的字符)

元字符 含义
\a 警报
\b 退格, 单词边界
\e ESC字符
\f 进纸符
\n 换行符
\r 回车符
\t 水平制表符
\v 垂直制表符

2.不确定范围的字符组

所谓字符组,就是包含一组特定字符,但只从中选一个.

我的理解是: 在[]中指定一个范围, 从中任意匹配一个

字符 含义
[abc] 匹配一个a,b ,c中的任意一个字符
[a-z] 匹配一个从a到z中的任意一个字符
[^abc] 匹配一个非a,b,c中的任意一个字符
[^a-z] 匹配一个不在a到z之中的字符
[[a-z]-[abc]] 字符组减法
[[a-z] && [ ^abc]] 字符组集合运算

注意,

普通字符组[]内其他部分元字符 不起作用,如[.]并不会匹配任意一个字符,而是匹配符号.

普通字符组[]内的\d, \w还是可以使用的

普通字符组内要匹配-,必须写在最前面,如[-abc]

3.确定范围字符组

范围明确,不需要你指定的字符组, 返回一个满足条件的字符

符号 含义
. 匹配任意字符
\d 匹配一个数字
\D 匹配一个非数字
\w 匹配一个单词字符, 即一个数字或字母
\W 匹配一个非单词字符
\s 匹配一个空白字符
\S 匹配一个非空白字符

4.限定(数量)字符

不匹配任意一个字符,放在匹配表达式后面,用来描述前面表达式的数量

字符 含义 举例 例子解释
* 匹配前面的子表达式零次或多次,即 a* a出现0次或多次
+ 匹配前面的子表达式一次或多次 a+ a至少出现一次
? 匹配前面的子表达式零次或一次 a? a出现一次或者不出现
{n} 匹配确定的 n 次 a{5} a必须出现5次
{n,} 至少匹配 n 次 a{99,} a至少出现99次
{n,m} 最少匹配 n 次且最多匹配 m 次 a{5,10} a出现5到10次

5.位置元字符

字符 含义
^ 匹配 行/字符串 开始的位置
\A 匹配文本起始位置,即第一行开头
$ 匹配 行/字符串 的结尾
\Z 匹配文本结束位置
\b 单词边界
\B 非单词边界
\G 上一次匹配结束的位置
(?= 指定内容 ) 肯定顺序环视,匹配指定内容前面的位置
(?! 指定内容) 否定顺序环视, 匹配非指定内容前面的位置
(?<=指定内容) 肯定逆序环视, 匹配指定内容后面的位置
(?<!指定内容) 否定逆序环视,匹配非指定内容后面的位置
(?<=指定内容1)(?=指定内容2) 匹配指定内容1之后,指定内容2之前的位置

把 1234567变成"1,234,567",可以用"(?<=\d)(?=(\d\d\d)+(?!\d)) "来寻找,的位置.


捕获和引用

符号 含义
(指定内容) 捕获括号,指定内容匹配成功后,内容被括号捕获,可以引用
\1,\2, …,\n 引用, 指定捕获的组号来引用内容, 组号从1开始
(?:指定内容) 非捕获括号, 即使指定内容被捕获, 内容也不参与捕获
(?p<指定名字>指定内容) 给分组命名,引用时用()
(?>指定内容) 固化分组, 简单来讲一直匹配直到不符合条件,且不归还内容
(指定内容1 指定内容2

对于捕获和引用, 如在串"12345678900"中,

搜索: (\d{3})(\d{8}) 替换为: 111\2 ,其中\2为组号 ,结果为"1112345678900"


贪婪模式和非贪婪模式

贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配

非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配.

如在’‘bbb>’'中匹配"<\w*>"

贪婪匹配得到: ‘‘bbb>’’; 非贪婪匹配得到: ‘’"

默认匹配为贪婪匹配, 直接使用 * , + 等符号

非贪婪匹配加"?": 如+?, *?

在"abbb"中匹配"ab+", 为贪婪匹配, 得"abbb".

在"abbb"中匹配"ab+?", 为非贪婪匹配, 得"ab".


注释和模式修饰词

表示 含义
(?i:指定内容) 匹配指定内容,不区分大小写
(?x:指定内容) 宽松排列和注释模式
(?s:指定内容) 点号通配模式
(?m:指定内容) 增强的行锚点模式
(?#指定内容) 注释

  1. ↩︎

posted @ 2019-06-29 16:46  lee3258  阅读(95)  评论(0编辑  收藏  举报