📜简介
🤔 正则表达式是啥?
🙄 它有啥用?
比如你在编辑一段文字的时候,如果你需要搜索文字内容里面某一个特定的字符串的时候你可能会点击菜单中的搜索按钮来搜索那个字符串。然而这种操作并非屡试不爽,有时你会遇到这种情况:文本内包含有很多有规律的字符串,比如“第一章”、“第二章”、“第三章”这种,而且这样的字符串在文本里面还有很多,你总不能一个个的搜索并删掉吧,因为这实在太考验人的耐性了。这个时候,一个叫做正则表达式的工具可以让你的搜索变得事半功倍。像上面这种情况你只需要在搜索框中输入:
第.+?章
就可以匹配到全部类似于“第__章”的字符串了!
很香🍚有木有? 下面就来介绍一下它的食用方法了!🍴
🍣 食用方法
和平时的文字不同,正则表达式是一种可以保留一些未知量的字符串,也就是一种规则,正则匹配就是找到符合这一规则的文本,我先举个栗子🌰:
如你所见,一条简单的正则表达式无非是由普通字符
,限定符
,定位符
组成,以下是三者的基本概念:
🍞普通字符:
何为普通字符?在表达式第.+?章
里面,第
、章
这类直接匹配的字符我们就称之为普通字符,而像.
、+
、?
这类用来描述规则的有特殊含义的字符就是特殊字符了。但是如果我们要匹配一个和特殊字符一样的普通字符呢,比如我们要匹配一条数学式子1+1=2
,这里就包含有+
,而它在这里仅仅是一个普通字符,所以我们在写表达式的时候可以使用转义符\
来使特殊字符转义成普通字符,即\+
就代表了一个形为+
的普通字符。
除此之外,如果我们要匹配一些类似与回车或者空格之类的非打印字符怎么办?这里是一个关于非打印字符的表格,你可以使用下列的字符来取代回车和空格之类的非打印字符!
字符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。 |
\f | 匹配一个换页符。等价于 \x0c 和 \cL。 |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ。 |
\r | 匹配一个回车符。等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK。 |
🥓限定符:
字符 | 描述 |
---|---|
* | 匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
看的明白这个表格嘛?如果你已经明白了,则可以跳过这几段直接看下一个内容定位符
如果你没看懂上表的话也没关系,在往下读之前,你只需了解有哪几个限定符就够了,下面我会为你介绍每一个的具体用法。
限定符,顾名思义就是拿来限定它前面的那个字符出现次数的,举个栗子🌰:
1. runb
2. runob
3. runoob
4. runooob
5. runoooo...b
上面有五个字符串,它们之间唯一的不同点就是o
的数量不一样,其中5
号还是无限多的!
下面我们分别用不同的限定符去匹配这些字符串。
甲. runo*b
乙. runo+b
丙. runo?b
三条表达式都在o
的后面使用了限定符,那不同限定符的匹配结果会是如何?
经过测试后我们可以得到如下结果
甲:1、2、3、4、5
乙:2、3、4、5
丙:1、2
为什么会这样?
我们先来看*
,它的类似与我们数学运算中的乘号,乘上一个数,而这个数可以是0,可以是1,还可以是其它的任何数,也就是意味着*
前面那个字符可以出现0到无穷次,所以就有匹配到0号
这种没有o
的字符串和有多个o
的字符串。
接下来看+
,和*
类似,也是与数学运算中的+
差不多,它可以匹配一个到无穷个o
,但匹配不到没有o
的那个,这就是它为什么匹配不到1
号的原因。
还有就是?
,它可以匹配零个或一个字符,也就是它前面那个字符可以存在一个也可以不存在,所以它只能匹配到1
和2
。
上面这三个限定符已经可以满足你大部分需求了,但是如果你遇到了这种情况:你想匹配一个文件中的全部电话号码,你选择了上面的*
或+
来匹配,你却发现匹配结果里面连邮政编码都一起匹配出来了,你才想起,邮政编码也是由一串数字组成的,显然这不是我们想要的结果。
如何解决呢,还记得上面表格里还有一种限定符我们没有使用吧,它就是{n, m}
这里的n
和m
是两个数字,一个是起始数量,一个是终止数量,也就是说,它可以匹配带有n
到m
个字符的字符串。有点懵?没关系,我们再来举个🌰:
上面说到我们在匹配电话号码的时候却连邮政编码都匹配出来了,然而聪明的我们发现,手机号码一般为十一位数,而邮政编码只有六位数,这时候我们就可以使用我们的{n, m}
限定符来匹配包含十一位数的电话号码了:[0-9]{11}
。
这时候你可能会发现,我只在{ }
里面填了一个数,这是因为我们是准确知道电话号码是十一位数的,我们填一个数进去就是精准匹配的意思,也就是{n}
的形式,如果我要匹配十一位数或以上的号码呢,那只需在n
的后面加上一个,
即可,它代表着匹配十一位到无穷多的字符,而少于十一位的就不匹配。那如果我想要匹配十一位到十五位的字符呢,这时就要用到{11, 15}
这样的表达式来限制了。
以上就是限定符的基本内容了👐
🍕定位符
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。 |
$ | 匹配输入字符串结尾的位置。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
🛠 正则表达式测试工具
🙆♂其他
部分内容参考自 正则表达式 | 菜鸟教程
以上。