正则表达式,听起来就很高大上,用起来其实挺复杂的,毕竟人家也算是一门语言,但我们在日常开发中如果会一点正则,你会发现有意想不到的效果,对我们开发的效率还是有一定的提高的。刚开始我一直想学习一下一些简单的正则,但每次看完一些资料当时好像明白怎么回事了,但过一段时间没用又忘了,其实说到底就是自己就根本没掌握好,加上又没去实践,当时理解了,长时间不用自然就忘了。所以说学到的知识需要用起来,这样才能加深理解,也不容易忘记。下面主要说一下正则表达式的简单运用,更加高深的正则可能需要花好些时间去系统的学习一番。
测试正则表达式是否正确可以去这个网址,下面的测试都是基于它测试出来的,地址如下:
基本匹配
这是最简单的正则,也就是平常我们习惯的搜索,根据指定字符去文本中搜索完全匹配的结果。
1 | eg. Regular expressions are a deep language. |
“dee” ==> Regular expressions are a
dee
p language.
“deep” ==> Regular expressions are adeep
language.
正则中的元字符
元字符 | 描述 |
---|---|
. | 点号匹配任意单个字符除了换行符 |
[ ] | 字符种类,匹配方括号内的任意字符 |
[^] | 否定的字符种类,匹配除了方括号里的字符外其他任意字符 |
* | 量词符号,表示 >= 0,即匹配 >=0 个在 * 号前的字符 |
+ | 量词符号,表示 >= 1,即匹配 >=1 个在 + 号前的字符 |
? | 量词符号,表示 >=0,<=1,即 + 号前的字符可出现可不出现 |
{n,m} | 大括号之前的字符出现 n 到 m 次 |
(abc) | 字符集, 匹配与 xyz 完全相等的字符串 |
| | 或运算符,匹配符号前或后的字符 |
\ | 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ | |
^ | 从文本的头部开始匹配 |
$ | 匹配到文本的结尾 |
以下面这句话为例,大致说明一下上面表格中的元字符的使用:
1 | eg. Regular expressions are a deep language. |
1.匹配 e 字符后面接上任意一个字符,包括空格。
“e.” ==> R
eg
ularex
pres
sions are
a dee
p language.
2.匹配 e 字符后面接上包含在中括号中的任意一个字符。
“e[g,x,e]” ==> R
eg
ularex
pressions are a dee
p language.
3.匹配 e 字符后面接上不包含在中括号中的任意一个字符,这里需要注意的是中括号中不能既加上包含字符,又加上不包含的字符,也就是不能这样写:”e[g,^x,^e]” 这样匹配出来的结果和上面匹配的结果一致,如果是把不包含的字符写在前面的话:”e[^g,x,e]” 这样匹配的结果则和下面的结果一致。
“e[^g,^x,^e]” ==> Regular expr
es
sions are
a deep
language.
4.匹配 e 字符后面接上包含中括号中 s 字符任意次,包括 0 次,就是也可以没有字符。
“e[s]*” ==> R
e
gulare
xpress
ions are
a de
e
p language
.
5.匹配 e 字符后面接上包含中括号中 s 字符 1次或多次,就是最少要出现一次。
“e[s]+” ==> Regular expr
ess
ions are a deep language.
6.匹配 e 字符后面接上包含中括号中 s 字符 0 次或 1 次,就是可有可无,注意和第 4 个的区别。
“e[s]?” ==> R
e
gulare
xpres
sions are
a de
e
p language
.
7.匹配 e 字符后面接上包含中括号中 s 字符指定次数,次数在大括号中指定,可以是一个固定数字,也可以是一个范围。
“e[s]{1}” ==> Regular expr
es
sions are a deep language.
“e[s]{2,3}” ==> Regular express
ions are a deep language.
8.匹配 ee 这个字符集出现 1 次到 2 次。
“(ee){1,2}” ==> Regular expressions are a d
ee
p language.
9.匹配 ee 这个字符集出现 1 次到 2 次或者匹配 ss 这个字符集出现 1 次到 2 次。
“(ee){1,2}|ss{1,2}” ==> Regular expre
ss
ions are a dee
p language.
10.匹配 e. 这两个字符,注意这里的点号并不是表示任意字符,经过转义后只是单纯的一个点号。
“e\.” ==> Regular expressions are a deep languag
e.
11.下面第一个表示忽略大小写全局匹配 Re 这个两个字符,第二个表示忽略大小写全局匹配以 Re 开头的字符串。
“Re/gi” ==>
Re
gular expre
ssions are
a deep language.
“^Re/gi” ==>Re
gular expressions are a deep language.
12.下面第一个表示忽略大小写全局匹配 re 加上任意字符,第二个表示忽略大小写全局匹配以 re 加上任意字符结尾的字符串。
“[r,g]e./gi” ==>
Reg
ular expres
sions are
a deep language.
“[r,g]e.$/gi” ==> Regular expressions are a deep language.
正则中的简写字符集
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
\w | 匹配所有字母数字, 等同于 [a-zA-Z0-9_] |
\W | 匹配所有非字母数字, 即符号, 等同于: [^\w] |
\d | 匹配数字: [0-9] |
\D | 匹配非数字: [^\d] |
\s | 匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}] |
\S | 匹配所有非空格字符: [^\s] |
前后关联约束
1.前置约束存在和前置约束排除:(?=…) 和 (?!…)
通俗点说就是对指定格式的前面的元素进行约束,前者是匹配到的元素后面跟着指定格式,后者是匹配到的元素后面不是跟着指定格式。结合例子可能更好理解:
1 | eg. Regular expressions are a deep language. |
“ar(?=\s)” ==> Regul
ar
expressions are a deep language //匹配 ar 字符串后面跟着的是空格。
“ar(?!\s)” ==> Regular expressionsar
e a deep language//匹配 ar 字符串后面跟着的不是空格。
上面两个正则都是对匹配到的 ar 字符串进行约束,前者是跟着的是空格,后者跟着的不是空格;前者约束存在,书写格式为 (?=…),后者约束不存在,书写格式为 (?!…)。
2.后置约束存在和后置约束排除:(?<=…) 和 (?<!…)
和上面的相对应,对指定格式的后面的元素进行约束,前者是匹配到的元素前面跟着指定格式,后者是匹配到的元素前面不是跟着指定格式。同样结合例子理解:
1 | eg. Regular expressions are a deep language. |
“(?<=\s)ar” ==> Regular expressions
ar
e a deep language //匹配 ar 字符串前面跟着的是空格。
“(?<!\s)ar” ==> Regular
expressions are a deep language//匹配 ar 字符串前面跟着的不是空格。
上面两个正则同样都是对匹配到的 ar 字符串进行约束,前者的前面要是空格,后者的前面要不是空格,同样的前者约束存在,书写格式为 (?<=…),后者约束不存在,书写格式为 (?<!…),相比上面多了个小于号。
标志
标志也叫修饰语, 它是用来修改表达式的搜索结果. 这些标志可以任意的组合使用, 它也是正则表达式的一部分,常用的标志有三种:g,i,m,分别表示全局搜索,忽略大小写,多行匹配。
1.全局搜索 g
1 | eg. Regular expressions are a deep language. |
匹配测试结果如下:
“ar” ==> Regul
ar
expressions are a deep language
“ar/g” ==> Regular
expressionsar
e a deep language
上面两者的区别在于第一个是只搜索匹配到的第一个结果,第二个是全局搜索,将所有匹配的结果全部搜索出来。
2.忽略大小写 i
1 | eg. Regular expressions are a deep language. |
匹配测试结果如下:
“Reg” ==>
Reg
ular expressions are a deep language
“REG/i” ==>Reg
ular expressions are a deep language
上面两者的区别在于第一个是只搜索字符完全匹配的结果,第二个是搜索忽略大小写的匹配结果。
3.多行匹配 m
1 | eg. Regular expressions are a deep language, |
“^Reg/g” 匹配结果如下:
Reg
ular expressions are a deep language,
Regular expressions are a deep language,
Regular expressions are a deep language.
“^Reg/gm” 匹配结果如下:
Reg
ular expressions are a deep language,Reg
ular expressions are a deep language,Reg
ular expressions are a deep language.
这样一对比两者的区别其实就已经出来了,第一个是全局搜索匹配到的结果,匹配的是第一行的开头,而第二个也是全局搜索匹配到的结果,只不过它是匹配每一行的开头。
以上就是正则表达式的一些基础运用,有了上面的基础,然后在平常开发中积极去尝试写出一些稍微复杂的正则,加强练习,不然只会像我刚开始一样,看完之后过一段时间就忘了,只有不断练习,慢慢的才会对正则有一些感觉。这些正则的基础也是我在 github 上找到一个关于学习正则的项目,然后通过这个项目的学习所掌握的,下面就是这个项目的地址:
常用正则表达式
1 | 整数: ^-?\d+$ |