正则表达式(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 的形式
