
正则表达式是一种复杂的替代表达式,由普通字符和元字符组成。正则表达式通常用来在一段文字中找到特定规律的字符,或者字符串(通过正则表达式找到字符串称为与正则表达式匹配)。正则表达式几乎就是一门关于字符串搜索和解析的小型编程语言,它很繁琐也很强大。当然,我们通常并不会用到它的所有功能。所以本文给大家介绍一下正则表达式的基础概念,字符和语法,展示正则表达式常用的功能,就可以完成日常工作中的很多问题了。
Let's GOOOOOOOOOOO!

元字符
在正则表达式中,普通字符只代表其原意,比如字母,数字等。而元字符则具有特殊的作用,比如代表字符重复的次数,字符分组,字符位置等等。下面是最为常用的元字符的简介:
\
- 反斜杠:转义字符,用于取消后续元字符的特殊含义,将其释义为普通字符。这个功能只对元字符有效
\n
- 回溯引用:从之前的正则表达式中提取第n个括号或子表达式的结果
^
- 插入符号:表示一行文字的开始,或表示“负组”的开头。表示“负组”相当于一个逻辑非,表示文字应匹配不在列表中的任何字符,比如
[^0-9]
即表示匹配任何不在0-9范围内的字符
$
- 美元符号:表示一行文字的末尾
.
- 点:用于匹配一个任意的字符
( )
- 圆括号:将一系列元素两边括上圆括号,将它们组合成为一个元素
[ ]
- 方括号:定义一组字符,在目标文字中找到一个字符与括号内的字符组匹配即可。比如:[ABC]可以与A,B或者C匹配
|
-
交替运算符(逻辑或):带有该操作符的正则表达式将匹配由该操作符分隔的任意一个字符串。比如:A|B可以匹配A或B或者包含A或B的字符串。
-
星号:这是一个计数器,星号前面的元素可以不出现,也可以出现1次或者任意次数
- 加号:这也是一个计数器,加号前面的元素可以出现一次或任意次数(不可以是0次)
?
- 问号:这也是一个计数器,问号前面的元素可以不出现,或者出现一次
{ }
- 花括号:比如{m,n},花括号前面的元素至少重复m次,但不超过n次

优先级
正则表达式中,元字符的含义理解是遵循一定的优先级顺序的:
优先级 | 元字符 | 含义 |
---|---|---|
1 | ( ) [ ] | 圆括号和方括号 |
2 | + * ? {m,n} | 各种计数器 |
3 | abc ^ $ | 字符,字符串,开始或结尾 |
4 | | | 交替运算 |
遵循优先级顺序,能够让正则表达式的意义传达地清晰且无歧义。
接下来,我们将详细介绍正则表达式的使用方法。

单独字符串
正则表达式最简单的情况,就是表达式中只有字符串。这种正则表达式只能匹配该字符串。比如:
hello 匹配'hello'
一般来说所有的字符都可以在正则表达式中使用,只有少数的标点符号(元字符)会表达一些特殊的意义。

转义字符\
有时我们在正则表达式中想使用元字符本身,而不是它的特殊功能。那么我们只需在元字符前面加上\
即可,比如像这样
想要匹配:* 不能直接输入*,而应该是\*
hello*again 左边的表达式会匹配到'hellagain'或'helloagain'或'hellooagain'
hello\*again 这样可以匹配到'hello*again'
如果我们想要搜索到反斜杠这个符号本身,而不使用转义字符的意义(比如在输入文件路径的时候就会用到),那么必须要写两个反斜杠。这样就可以用第一个转义字符取消第二个转义字符的特殊含义,得到一个反斜杠啦!
.*\\abc 匹配任意包含abc文件夹或文件的路径名

回溯引用\n
使用\n
的表达式(1 <= n <= 9,就可以从之前的正则表达式中,提取第n个子括号或者子表达式的结果。但是在实际使用过程中,为了避免过于复杂的表达式,通常不建议使用过大的数字,尽量只使用\1
。
\1 从之前(1个)括号或子表达式中提取结果
根据信息科学的定义,这个回溯引用的方法实际上不属于正则表达式,而是正则表达式的一种拓展应用。

元字符^
和$
^
和$
字符允许在搜索区域的指定位置搜索,^
为搜索的开始位置,$
为搜索的结束位置。例如:
^EA 匹配到开头为EA的字符串
EA$ 匹配到结尾为EA的字符串
^EA$ 只能匹配到字符串中,EA这两个字符
^
还有一个功能为负字符集,该功能将在下文中讲到。

元字符.
一个点.
能够匹配一个任意字符。
h.llo 可以匹配到'hello','hallo','hlllo'等等

字符集与[]
-
和^
字符可以组合成为一个字符集,只要将它们用方括号[]
括起来就可以了。括号中定义的字符集可以与括号中列出的任何单个字符相匹配。而两个字符之间的负号-
表示表达式匹配从第一个字符到第二个字符范围内的任何字符。
[XAEL] 可以匹配到'X','A','E'或'L'中的任意一个字符
[0-9] 可以匹配到0到9之间的所有字符,也就是任意单个数字
如果左边的括号后插入一个元字符^
,那么该正则表达式就指定了一个负字符集或负范围。那么该表达式可以匹配任何不在括号说明内的任意单个字符。比如:
[^a-z] 可以匹配所有不是小写字母的字符
[^AEIOUaeiou] 可以匹配所有不是元音的字符
在字符集中,所有的字符都代表其本身。只有\
,^
,-
是例外,并且[
]
比较特别。如果在字符集中需要半个方括号字符,那么要把半个方括号字符放在左括号之后的第一个字符。如果字符集中需要有-
字符,那么可以将其放在左括号之后的第一个字符或者放在右括号之前的最后一个字符,再或者,连打三个负号---
即可。如果字符集中需要有^
字符,那么只要不将其放在第一个字符的位置就可以了。
单纯的描述有些难以理解,让我们来看几个例子:
[]a] 匹配到']'和'a'
[a---b] 匹配到'a','b'和'-'
[-a] 匹配到'a'和'-'
[a-] 匹配到'a'和'-'
[a^b] 匹配到'a','b'和'^'

元字符|
元字符|
允许将多个备选搜索项与逻辑或连接起来。那么该正则表达式可以与所有至少包含一个可选字符串的字符串匹配。
a|b 匹配'a'或'b'
a|bc|d 匹配'a'或'bc'或'd'
(a|b)(c|d) 匹配'ac'或'ad'或'bc'或'bd'
power(boat|brake) 匹配'powerboat'或'powerbrake'
(shutt|crack)(er|le) 匹配'shutter'或'shuttle'或'cracker'等
.*(old|ike) 匹配'old'或'hold'或'mike'或'hike'等
其中,备选搜索项可以使用任何正则表达式。

元字符(
和)
圆括号用于将几个单独的字符分组,将圆括号中的字符作为一个整体。通过使用括号,可以更改正则表达式的含义,并且还可以使用嵌套括号。
比如,如果在括号中的一组字符后面设置了一个元字符*
,则该元字符引用括号中的整个字符组。例如:ban(an)*a

元字符*
该字符指定前面的表达式可以出现零次、一次或多次。也就是说,指定前面的表达式可以出现任意次,也可以不出现。
.* 可以匹配到任意字符或字符串
hello* 匹配'hell'或'hello'或'helloo'等
ban(an)*a 匹配'bana'或'banana'或'bananana'等

元字符+
该字符指定前面的表达式可以出现一次或多次,即至少出现一次。
AB+C 匹配'ABC'或'ABBC'或'ABBBC'等
ban(an)+a 匹配'banana'或'bananana'等

元字符?
该字符指定前面的表达式可以出现零次或一次,即至多出现一次。可以理解为?
表示前面的表达式是否会出现?
hello? 匹配'hell'或'hello'

元字符{
和}
像{m,n}这样的花括号中的表达式是一个计数器。该计数器表示前一个字符组至少出现m次,并且至多出现n次。注意,m和n必须为正整数,并且n大于等于m。
(ab){1,2} 匹配'ab'或'abab'
[AEIOUaeiou]{2} 匹配'AA'或'aa'或'EE'等
c([ad]){1,4}r 匹配'car'或'cdr'或'caar'或'cdaddr'等

大小写敏感
正则表达式默认为大小写敏感,想要将表达式转换为大小写不敏感,只需在表达式前加上(?i)
。
(abcd) 匹配到'abcd'
(?i)(abcd) 匹配到'abcd'或'Abcd'或'ABcd'等等
如果只想让表达式中的一部分变得大小写不敏感,用字符集的方法其实是相对更方便的做法。例如:
a[Bb]cd 匹配到'aBcd'或'abcd'
那么,本篇文章向大家介绍了比较常用的正则表达式的符号和语法。实际上,正则表达式还包含更多的内容,更繁琐也更强大。而且,不同的编程语言支持的正则表达式功能也会有所不同。所以,其他的正则表达式功能就需要在具体情境下边使用边学习了。
本文介绍的符号和语法,可能一下子无法全部记住。作者推荐可以结合一些实际例子去操作一下。当然,如果你还是记不住......
下一篇文章我会给你个好东西
敬请期待啦!

网友评论