正则表达式基础语法摘要
什么是正则表达式呢,先来看一下百度百科中的解释:
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说,正则表达式是一种特定的模式,可以用来对文本进行匹配、替换或删除等操作。正则表达式本身与编程语言无关,是一种强大的文本处理工具。
基础概念
正则表达式由两种字符构成:元字符和普通文本字符。其中,元字符 即正则表达式中的特殊字符,为正则表达式提供了强大的描述能力,如:*
和.
量词:?
, +
, *
。这三个元字符可以用来限定所作用元素的重现次数。
字符组:形如[Regex...]
的表达式子句
贪婪:如*
字符。贪婪量词会匹配尽可能多的字符串
非贪婪模式:即尽可能少的匹配字符串,一般对表达式后加?
即可实现
元字符总结
匹配单个字符
元字符 | 匹配对象 |
---|---|
\d | 匹配一个数字 |
\D | 匹配一个非数字字符 |
\w | 匹配一个数字、字母和下划线字符 |
\W | 匹配一个非数字、字母或非下划线的字符 |
\s | 匹配一个空白符字符,如空格和制表符 |
\S | 匹配一个非空白符字符,如空格和制表符 |
. | 匹配除换行符以外的任意单个字符 |
[...] | 字符组,匹配括号中的任意一个字符 |
[^...] | 排除型字符组,匹配括号中未列出的任意一个字符 |
\Char | 若Char是元字符,可以将其转义为对应的普通字符进行匹配。如\. 匹配一个“.” |
有计数功能的元字符
元字符 | 匹配对象 |
---|---|
? | 匹配零次或一次 |
* | 匹配任意多次,也可以不匹配 |
+ | 匹配任意多次,但至少必须匹配一次 |
{min, max} | 至少匹配min次,至多匹配max次。 |
{, max} | 至少匹配0次,至多匹配max次 |
{min, } | 至少匹配min次,但匹配次数不设上限 |
{n} | 匹配n次 |
匹配位置的元字符
元字符 | 匹配对象 |
---|---|
^ | 匹配起始位置,当出现在字符组开头时,表示排除(也可理解为取反) |
$ | 匹配结尾位置 |
\b | 匹配字符边界,但不会消耗字符,只匹配一个位置。如从"This is Regex"中匹配"is": \bis\b |
其他
元字符 | 匹配对象 |
---|---|
\ | 匹配任意分割的表达式 |
(...) | 限定多选结构的范围,标注量词作用的元素,可以为反向引用捕获文本 |
\1, \2 ... | 反向引用。匹配之前的第一,第二组括号内的表达式匹配到的文本 |
非贪婪模式
举例:清溪路555号10号楼
匹配地址中的路号,首先可能会想到:.*(\d+)号.*
,但实际上,前面的.*
为贪婪模式,会首先向后尽可能多的匹配,会导致小括号中的\d+
只能匹配到10号楼
中的0
(因为是从左向右开始匹配,.*
匹配用掉了太多的字符串,只留下一个数字0
给\d+
进行匹配)。
如果想要匹配出555
,则需要写成.*?(\d+)号.*
,注意多了一个问号。这就是非贪婪模式,问号前面的表达式会尽可能少的匹配,只要整个表达式匹配成功即可。
基本上可以总结如下表达式:
元字符 | 匹配对象 |
---|---|
*? | 匹配任意次,但要尽可能少 |
+? | 匹配1次或更多次,但要尽可能少 |
?? | 匹配0次或1次,但要尽可能少 |
{min, max}? | 匹配min到max次,但要尽可能少 |
分组
正则表达式中的分组,基本都由(exp)
模式来实现,常见语法如下:
元字符 | 匹配对象 |
---|---|
(exp) | 匹配exp并捕获匹配到的值到默认的组里 |
(?<name>exp) | 匹配exp并捕获值到name组中 |
(?:exp) | 匹配exp,但不捕获匹配到的值,也不给此组分配组号 |
(?=exp) | 匹配exp前面的位置,如上面的地址,我们要提取小区地址,应该写成(.+?(?=\w+?号楼)) ,会匹配出清溪路555号 |
(?<=exp) | 匹配exp后面的位置 |
(?!exp) | 匹配后面不是exp的位置,如137(?!\d) 匹配的是137开头的、非数字结尾的字符串,例:137a |
(?<!exp) | 匹配前面不是exp的位置 |
相关推荐
MaggieRose 2020-08-19
山水沐光 2020-08-03
wangzhaotongalex 2020-10-20
rechanel 2020-11-16
cshanzhizi 2020-10-16
luofuIT成长记录 2020-09-22
taomengxing 2020-09-07
jyj00 2020-08-15
MaggieRose 2020-07-04
modaiairen 2020-06-28
ziggurat 2020-06-28
JnX 2020-06-27
jyj00 2020-06-26
山水沐光 2020-06-25
shqhope 2020-06-23
eroshn 2020-06-21
码墨 2020-06-16
wyq 2020-11-11
TLROJE 2020-10-26