一个学习连接
https://deerchao.net/tutorials/regex/regex.htm
下面是百度百科对正则表达式的解释
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串
这里列出一些常用的特殊字符,详细内容参照谷歌或者去微软官网查看
微软正则表达式
学会正则表达式的关键,就在与搞清楚每个符号之间的关系,搞清楚关系之后,我们就可以进行有机则组合。
我将正则表达式大致分为四种类型,占位符、数量表达符、位置表达符、条件表达符。
提醒大家一点,此分类方法并不严谨,但是这样很好理解,学习此篇文章后,可在互联网参照其他文章。
占位符: 类似于字母,一个字母占一个位,匹配一个字母,那么特殊符号也匹配所代表的字符
符号 | 意义 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
[a,b,c] | 方括号占一个位置,表示在a b c 中任意选择一个字符 |
数量表达符: 与占位符连用,一般跟在占位符的后面表示该占位符的数量,例子:\d{3}
会匹配三个数字。
符号 | 意义 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
位置表达符: 与占位符连用,表达要匹配的数据在字符串的哪里,\b
是表达单词边界,例子:\ba\w+
会匹配以单词以a开头的字符串,如abd
、apple
之类的字符。
符号 | 意义 |
---|---|
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
条件表达式: 用于筛选符合条件的字符,在与占位符
、数量表达符
、位置表达符
组合使用,例子:
(?<=the\s)apple
会匹配,而不会匹配前面没有the
的apple。
the
apple
apple apple theapple
表达式中的exp是需要的表达式
条件表达式 | 意义 |
---|---|
(?<=exp) | 用于判断条件该表达式(括号)的位置前面 的内容是否符合exp ,如果符合则匹配 |
(?=exp) | 用于判断条件该表达式(括号)的位置后面 的内容是否符合exp ,如果符合则匹配 |
(?<!exp) | 用于判断条件该表达式(括号)的位置前面 的内容是否符合exp ,如果不 符合则匹配 |
(?!exp) | 用于判断条件该表达式(括号)的位置后面 的内容是否符合exp ,如果不 符合则匹配 |
难点一:零宽断言与负向零宽断言
1、零宽断言
(?=exp)
也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。请读者仔细阅读下面的表达式,只要能读懂就可深度理解零宽断言
(?<=exp)
也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。
首先我们先明白此类断言的性质–零宽断言是条件表达符,不占位
判断逻辑是:如果=
号后面条件与被匹配文本相吻合,则匹配吻合筛选条件的文本(不包含条件)
请仔细观察上面四幅图的变化,以发现内在规律。
例子:
设置两组对比文本,123456789
和123406789
,只有中间的0和5不同
以下用自然语言解读4幅图
1:如果该条件((?=)
)所在位置后面的数字是0
,则匹配符合该条件的字符串中的非条件表达符部分,有点拗口,也就是说,表达式(1234\d6789
)只匹配4
后面的数字为0
的字符串。
2:如果该条件((?=)
)所在位置后面的数字是5
,我就匹配符合该条件的字符串中的非条件表达符部分,有点拗口,也就是说,表达式(1234\d6789
)只匹配4
后面的数字为5
的字符串。
3:如果该条件((?<=)
)所在位置前面的数字是0
,则匹配符合该条件的字符串中的非条件表达符部分,有点拗口,也就是说,表达式(1234\d6789
)只匹配4
前面的数字为0
的字符串。
3:如果该条件((?<=)
)所在位置前面的数字是5
,则匹配符合该条件的字符串中的非条件表达符部分,有点拗口,也就是说,表达式(1234\d6789
)只匹配5
前面的数字为0
的字符串。
该表达是只是条件表达符,用来筛选文本,不进行输出匹配,而对于?=
和?<=
的区别以上例子表达的很清楚了,即,没有<
的向后匹配,有<
的向前匹配。
2、负向零宽断言
与正向断言类似,只需要把=
改成!
仔细观察便知。