> 技术文档 > 正则表达式 速查速记

正则表达式 速查速记

 

基本字符匹配(Basic)

表达式

说明

.

匹配除了换行符之外的任意单个字符。

[ ]

匹配方括号内的任意⼀个字符。例如, [abc] 会匹配\"a\", \"b\", 或 \"c\"。

可以使用 - 表示范围,例如, [a-z] 就表示所有小写字母。

[^ ]

匹配不在方括号中的任意字符。例如, [^abc]表示非\"a\", \"b\", \"c\"的任意字符。

|

逻辑或操作。例如, cat|dog匹配\"cat\"或\"dog\"。

-

定义一个范围(例如[a-z]

\\

对下一个字符转义

字符类(Character Class)

表达式

说明

\\d

匹配任意数字,等价于 [0-9]

\\D

匹配任意非数字字符,等价于 [^0-9]

\\w

匹配任意字母数字字符及下划线,等价于 [a-zA-Z0-9_]

\\W

匹配任意非字母数字字符,等价于 [^a-zA-Z0-9_]

\\s

匹配任意空白字符(空格、 Tab、换行符等)。

\\S

匹配任意非空白字符。

\\t

制表符(Tab键)

\\r

回车符

\\n

换行符

\\f

换页符

\\v

垂直制表符

\\x

匹配一个十六进制数字。在正则表达式中,十六进制值(基数为16)要用前缀\\x来给出,比如,\\x0A(对应于ASCII字符10,也就是换行符)等价于\\n

\\0

匹配一个八进制数字。在正则表达式中,八进制数值(基数为8)要用前缀\\0来给出,数值本身可以是两位或三位数字,比如:\\011(对应于ASCII字符9,也就是制表符)等价于\\t

\\c

匹配一个控制字符。部分正则表达式引擎支持\\c匹配控制字符,比如,\\cZ可以匹配Ctrl-Z。不过,在实践中极少用到这种语法

量词(Quantifiers)

表达式

说明

*

匹配0次或者多次前面的元素。

+

匹配1次或者多次前面的元素。

?

匹配0次或者1次前面的元素。

{n}

确切匹配n次前面的元素。

{n,}

匹配n次或更多次前面的元素。

{n,m}

匹配n次到m次前面的元素。

定位符(Anchors)

表达式

说明

^

匹配每行的开头。例如: ^Hello 匹配以Hello开始的行。

$

匹配每行的结尾。例如: World$ 匹配以World结尾的行。

\\b

匹配一个单词的边界(开头和结尾)。例如, \\bin\\b 就会精确确匹配单词in, 而不会匹配单词find中的in。

\\B

匹配非单词边界,与\\b相反。

\\<

匹配单词的开头

\\>

匹配单词的结尾

POSIX字符类(POSIX Charactor Class)

表达式

说明

[:xdigit:]

任何一个十六进制数字(等价于[a-fA-F0-9]

举一个示例(其他的POSIX字符用法都类似)

利用正则表达式从一段CSS代码中把RGB值找出来:

body { background-color: #fefbd8;}h1 { background-color: #0000ff;}div { background-color: #d0f4e6;}span { background-color: #f08970;}

#[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]

注意:这里使用的模式以[[开头,以]]结束(两个方括号)。这是使用POSIX字符类所必须的。POSIX字符类必须出现在[:和:]之间,这里使用的POSIX字符类是[:xdigit:](不是:xdigit:)。外层的[和]字符用来定义一个字符集合,内层的[和]字符是POSIX字符类本身的组成部分。

[:alnum:]

任何一个字母或数字(等价于 [a-zA-Z0-9]

[:alpha:]

任何一个字母(等价于 [a-zA-Z]

[:blank:]

空格或制表符(等价于[\\t ]

[:cntrl:]

ASCII控制字符(ASCII 0到31,再加上ASCII 127)

[:digit:]

任何一个数字(等价于[0-9]

[:graph:]

[:print:]一样,但不包括空格

[:lower:]

任何一个小写字母(等价于[a-z]

[:print:]

任何一个可打印字符

[:punct:]

既不属于[:alnum:],也不属于[:cntrl:]的任何一个字符

[:space:]

任何一个空白字符,包括空格(等价于[\\f\\n\\r\\t\\v ]

[:upper:]

任何一个大写字母(等价于[A-Z]

贪婪(Greedy)和懒惰(Lazy)

表达式

说明

ab{3,}

默认贪婪匹配,只要后面的字符依然满足条件,就会继续匹配。abbb、 abbbb、 abbbbb、 abbbbbb都满足要求。

ab{3,}?

在量词后面加上问号就表示非贪婪匹配,即懒惰匹配,满足条件之后,即使后面依然符合条件也不会再继续匹配了。只有abbb满足要求,abbbb、 abbbbb、 abbbbbb就只有前面的部分满足要求。

旗标(Flags)

表达式

说明

i

case insensitive ,表示忽略大小写。

m

multi-line,多行模式

s

允许 . 匹配包括换行符在内的所有字符。

g

global,全局搜索,匹配文本中的所有实例。

 

分组和引用(Groups)

表达式

说明

(abc)

捕获分组。可以将多个字符当做一个整体来处理,也可以在后面引用捕获到的分组内容。

例如:想要匹配2024-05-01这样的日期格式,就可以使用:

(\\d{4})-(\\d{1,2})-(\\d{1-2}) 来分别捕获年、月和日的值,后面也可以使用\\1、 \\2\\3或者$1、 $2、 $3来引用它们。

(?:abc)

非捕获分组,仅使用分组功能,而不捕获。后面也不可以使用\\1或者$1来引用。

前瞻(Lookahead)

表达式

说明

(?=...)

正向前瞻(Positive Lookahead)

只有当后面分组中的匹配成立时,才会匹配到它前面的指定内容。

例如:cat(?=dog) 会匹配 catdog 中的 cat,但是不会匹配 catcow 或者 catpig 中的 cat。(找到狗前面的猫)

(?!...)

负向前瞻(Negative Lookahead)

只有当后面分组中的匹配不成立时,才会匹配到它前面的指定内容。

例如:cat(?!dog) 不会匹配到catdog中的cat,但是会匹配catcow中的cat。(找到不在狗前面的猫)

后顾(Lookbehind)

表达式

说明

(?<=...)

正向后顾(Positive Lookbehind)

只有当前面分组中的匹配成立时,才会匹配到它后面的指定内容。

例如:(?<=cat)dog 会匹配 catdog中的dog,但是不会匹配cowdog或者pigdog中的dog。(找到猫后面的狗)

(?<!...)

负向后顾(Negative Lookbehind)

只有当前面分组中的匹配不成立时,才会匹配到它后面的指定内容。

例如:(?<!cat)dog 不会匹配 catdog中的dog,但是会匹配到cowdogpigdog中的dog。(找到不在猫后面的狗)

嵌入式条件(Embedding Condition)

表达式

说明

(?(backreference)true)

反向引用条件

反向引用条件仅在一个前面的子表达式得以匹配的情况下才允许使用另一个表达式。

例如:需要匹配一段文本中标签全部找出来,同时,如果某个标签位于标签之间,还要匹配整个链接标签。

正则表达式 速查速记正则表达式 速查速记

(]+\\s*)?]+>\\s*(?(1)\\s*)

注意:?(1)检查第一个反向引用是否存在。在条件里,反向引用编号不需要被转义。因此,?(1)是正确的,?(\\1)是错误的(但通常也能用)

(?(backreference)true|false)

反向引用条件的else

例如:123-456-7890和(123)456-7890是可接受的北美电话号码格式,其他的都不正确。请编写一个只匹配正确格式的正则。

123-456-7890(123)456-7890(123)-456-7890(123-456-7890

(\\()\\d{3}(?(1)\\)|-)\\d{3}-\\d{4}

(?(?=...)true|false)

(?(?<=...)true|false)

否定式

(?(?!...)true|false)

(?(?<!...)true|false)

环视条件

环视条件允许根据向前查看或向后查看操作是否成功来决定要不要执行表达式。环视条件的语法与反向引用条件的语法大同小异,只需要把反向引用(括号里的反向引用编号)替换为一个完整的环视表达式就行了。

例如:美国邮政编码有两种格式,一种是12345形式的ZIP编码,另一种是12345-678形式的ZIP+4编码,只有ZIP+4编码才必须使用连接符-。请匹配美国邮政编码。

111112222233333-44444-4444

\\d{5}(?(?=-)-\\d{4})

当然还可以有其他解法,如:\\d{5}(-\\d{4})?

替换(Replace)

表达式

说明

查找:

替换:

替换操作需要用到两个正则表达式:一个用来指定搜索模式,另一个用来指定替换模式。反向引用可以扩模式使用,在第一个模式里匹配的子表达式可以用在第二个模式里。

例如:

Welcome to my Homepage

查找:()(.*?)()

替换:$1\\U$2\\E$3

结果:

WELCOME TO MY HOMEPAGE

\\E

结束\\L或\\U转换

\\l

把下一个字符转换为小写

\\L

把后面的字符转换为小写,直到遇见\\E为止

\\u

把下一个字符转换为大写

\\U

把后面的字符转换为大写,直到遇见\\E为止