正则表达式(regular expression)
正则表达式概述
正则表达式是用于匹配字符串的一种表达式,他可以精确描述某种字符串的特征用一匹配和提取
字符
单个字符
可以用单个的字符表示正则表达式必须匹配一个字符,例如,使用 abc
作为正则表达式,那么会提取所有的含有 abc
的部分,包括某个单次中含有 abc
这个片段,例如 abcdef
中的 abc
也会被匹配。
字符集合
字符的集合用 []
中括号包裹,表示这个位置上面可能有[]
中的某个字符,例如 ab[cde]
就可以匹配 abc\abd\abe
但不会匹配 abf
在这个里面,可以使用例如 [0-9]
表示匹配 0
到 9
中的任意一个字符。
如果要表示取反,可以在括号里面加上一个 ^
例如 [^A-Z]
表示这里匹配一个除了大写字母之外的字符
其他元字符
通配符
这里的单个的通配符是 .
在没有其他符号包裹的情况下,.
可以匹配任意一个字符。
数字集合
数字可以简写为 \d
是digit的缩写
边界字符
\b
表示单词的边界,例如\babc\b
就只会匹配abc
这个独立的单词,而abcd
或aabc
则不会被匹配\B
表示非单词的边界,与上面相反\w
表示任意单词字符,相当于[a-zA-Z0-9_]
\s
表示空白字符,包括空格、制表符、换行符等^
表示字符串开头,例如^abc
可以匹配以abc
开头的字符串$
表示字符串的结尾,例如abc$
表示以abc
结尾的字符串
量词
两次用于描述一个结构重复的次数,例如
- 用于匹配一次或多次,例如
at+
可以匹配at/att/attttt
- 用于匹配一次或多次,例如
- 用于匹配零次、一次或多次,例如
at*
可以匹配a/at/att
- 用于匹配零次、一次或多次,例如
- ?用于匹配一个结构零次或一次,例如
at?
仅可以匹配a/at
- 用大括号包裹起来的可以用于描述匹配次数的下限和上限,例如
at{2}
仅可匹配att
而at{1,3}
可以匹配at/att/attt
且仅限于此
==注意,这里的匹配是贪心的,例如如果使用at+
来匹配attttttttt
那么这里所有的t都会被匹配上==
分组和捕获
分组
使用小括号 ()
可以表示分组,将多个字符当做一个整体来匹配,例如 (at){1,3}
可以匹配 at/atat/atatat
这三个串
捕获
在正则表达式里面可以用创建的分组进行捕获,比如第一个捕获就是匹配上第一个分组的部分,例如在正则表达式 (at \d floor)
匹配 at 1 floor...
的时候,获得的捕获就是 at 1 floor
后续可以使用 \1
来代表第一个捕获,例如可以使用正则表达式 \b(\w)\w+\1\b
来匹配首尾字母相同的字符串,上面这个正则表达式中的第一个分组捕获了单词开头的字母,后续使用 \1
来表示第一个捕获,即这里表示单词的第一个字母
捕获还可以用于查找替换里面用某些捕获的部分来实现格式化,例如在查找栏输入 (\d{4})[/_-:](\d{1,2})[/_-:](\d{1,2})
即可匹配形如 2024-9_1
之类的日期,在替换的时候可以使用 $1_$2_$3
把所有日期格式化成 2024_9_1
的形式