正则表达式概述

正则表达式是用于匹配字符串的一种表达式,他可以精确描述某种字符串的特征用一匹配和提取

字符

单个字符

可以用单个的字符表示正则表达式必须匹配一个字符,例如,使用 abc 作为正则表达式,那么会提取所有的含有 abc 的部分,包括某个单次中含有 abc 这个片段,例如 abcdef 中的 abc 也会被匹配。

字符集合

字符的集合用 [] 中括号包裹,表示这个位置上面可能有[] 中的某个字符,例如 ab[cde] 就可以匹配 abc\abd\abe 但不会匹配 abf 在这个里面,可以使用例如 [0-9] 表示匹配 09 中的任意一个字符。

如果要表示取反,可以在括号里面加上一个 ^ 例如 [^A-Z] 表示这里匹配一个除了大写字母之外的字符

其他元字符

通配符

这里的单个的通配符是 . 在没有其他符号包裹的情况下,. 可以匹配任意一个字符。

数字集合

数字可以简写为 \d 是digit的缩写

边界字符

  • \b 表示单词的边界,例如 \babc\b 就只会匹配 abc 这个独立的单词,而 abcdaabc 则不会被匹配
  • \B 表示非单词的边界,与上面相反
  • \w 表示任意单词字符,相当于 [a-zA-Z0-9_]
  • \s 表示空白字符,包括空格、制表符、换行符等
  • ^ 表示字符串开头,例如 ^abc 可以匹配以 abc 开头的字符串
  • $ 表示字符串的结尾,例如 abc$ 表示以 abc 结尾的字符串

量词

两次用于描述一个结构重复的次数,例如

    • 用于匹配一次或多次,例如 at+ 可以匹配 at/att/attttt
    • 用于匹配零次、一次或多次,例如 at* 可以匹配 a/at/att
  • ?用于匹配一个结构零次或一次,例如 at? 仅可以匹配 a/at
  • 用大括号包裹起来的可以用于描述匹配次数的下限和上限,例如 at{2} 仅可匹配 attat{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 的形式