0%

正则表达式入门一

首先,正则表达式是用来描述符合某些复杂规则的字符串

本文主要是给自己做的笔记,其中大量参考了https://deerchao.cn/tutorials/regex/regex.htm的内容。

了解

首先先展示一些代码的功能:
. 表示任何单个字符
[ ] 字符集,对单个字符给出取值范围 [abc]表示a、b、c,
[^] 对单个字符给出排除范围 [^abc]表示非abc的单个字符
* 前一个字符0次或无限次扩展
+ 前一个字符一次或无限次扩展
? 前一个字符0次或1次扩展
| 左右表达式任意一个 abc|def 表示abc、def
{m} 扩展前一个字符m次 ab{2}c表示abbc
{m, n} 扩展前一个字符m至n次 ab{1,2}c表示abc、abbc
^ 匹配字符的开头 ^abc表示abc且在一个字符串的开头
$ 匹配字符串开头 abc$表示abc且在一个字符的结尾
( ) 分组标记,内部只能使用|操作符 (abc)表示abc,(abc|def)表示abc、def
\d 数字,等价于[0-9]
\w 单词字符,等价于[A-Za-z0-9_]
\b 匹配单词的开始或结束

这些代码的组合就可以匹配各种复杂的字符串

我们先来看几个经典的正则表达式:
^[A-Za-z]+$ 由26个字母组成的字符串
^-?\d+$ 整数形式的字符串
^[0-9]*[1-9][0-9]*$ 正整数形式的字符串
[1-9]\d{5} 中国境内邮政编码,6位
[\u4e00-\u9fa5] 匹配中文字符

这几个我们可以等会在返回来看,我们先从简单的开始

入门

匹配简单字符

hi 可以匹配hi这个字符,只要是含有hi便可以匹配,如hi,him里的hi

那如何匹配一个单词呢?

首先我们先介绍一下”单词“的概念,这和我们通常理解的有些许不同:

\w可以匹配任何一个字母或数字或中文或下划线,注意是一个
然后,不少于1个\w连起来中间没有其他的东西即为单词
比如 abc, a_3 都是单词

那我们要匹配hi这个单词的话,就可以使用 \bhi\b

匹配数字

如果我们想匹配一组类似于010-12345678这样的电话号码的话
我们要用到的代码有

\d 表示一个数字
{m} 扩展前一个字符m次

现在,我们写出这样的表达式:
0/d{2}-/d{8}

0表示匹配0,所有的电话号码开头都是0,然后后面匹配两位数字,然后匹配中横线,
最后再匹配8位数字

如果我们既想匹配上面的电话号,又想匹配正常的手机号码(如18012345678),那么
就需要用到分支条件,代码为|

首先我们看了解部分里的代码

| 左右表达式任意一个 abc|def 表示abc、def

这样就很清晰明了了,代码如下

0/d{2}-/d{8}|1/d{2}/d{8}

这样就能匹配到两种不同格式的电话号码了

如果我们想要匹配多组重复的数据的话,我们就需要()来建立一个子表达式,然后可以对
这个表达式进行相关的操作,如表示IP地址,IP地址是由4个不大于255的数字加.组成的
如:
0.0.0.0
10.0.0.1
127.0.0.1
192.168.1.1
255.255.255.255
都是合法的IP地址,我们先用一组正则表达式表达四个数字中的一个:
这个数字有几种情况:[01]?\d\d?、2[0-4]\d、25[0-5],分别代表了0-199、200-249、
250-255这几个区间,我们用|把他们连接起来,就构成了表达0-255的表达式,现在在用
()把这组数字变成一个子表达式,然后再重复四次,IP地址的表达式就完成了。

([01]?\d\d?|2[0-4]\d|25[0-5].){3}([01]?\d\d?|2[0-4]\d|25[0-5])

值得注意的是.这个符号只出现了三次,所以最后的地址是不带.的

反义代码

反义的代码就是反过来,如\w匹配任何字母数字汉字,那\W就是匹配除了字母数字汉字以外的字符

反义代码有以下几个:

\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符

分组

在开头提到的那篇文章里,这部分的用法叫后向引用,但是这个名字有点晦涩难懂,所以我习惯叫分组

使用小括号的子表达式,都会有一个默认的分组编号,通过这个编号我们可以重复的搜索前面分组匹配过的文本,下面举个例子:

首先我们匹配一个普通的单词:
\b(\w+)\b
这个正则表达式的意思是匹配一个单词,前后\b是单词的开头和结束,中间是\w匹配一次或多次扩展,这个单词会被标记为分组一(如果前面没有过这样的分组的话),然后我们可以直接引用\1这个代码表示这个分组,如:

\b(\w+)\b \1 这样的表达式意思是匹配一组相同的单词,中间用空格分隔,注意这样的写法,如果文本是yi yie这样的,他也会匹配出yi yi,但是如果正则表达式为\b(\w+)\b \1\b,就不会匹配出这样的结果,因为yie才是一个单词

我们还可以指定分组的组名,使用的语法是(?exp),也可以把尖括号改为单引号:

\b(?\w+)\b \k\b

引用自己命名的分组是\k<组名>,引用的结果和上面一样

还有一种代码,格式为(?:exp),这种格式会不分配组号,也不捕获文本,只是会单纯的匹配文本

第一章完~