正则表达式

正则表达式

正则表达式是一种用于字符串搜索和操作的表达式,它由普通字符(如字母a到z)和特殊字符(称为"元字符")组成。

通过定义特定的模式,可以用于:

  • 检查字符串是否符合某种格式(如邮箱验证)
  • 查找符合特定规则的子串
  • 提取字符串中的特定部分
  • 替换文本中的内容

核心语法

字符匹配

表达式 说明 示例
. 匹配任意单个字符 a.c 匹配 aac, abc, a与c中间可以是任意字符
\d 匹配数字(0-9) \d\d 匹配 11,12 匹配两位的数字
\D 匹配非数字 \D\D 匹配 ab,@A 匹配两位的非数字
\w 匹配字母、数字、下划线 \w\w 匹配 ab, b_
\W 匹配非字母、数字、下划线 \W\W 匹配 %&, !@
\s 匹配空白字符(空格、制表符等) a\sb匹配 ‘a b’
\S 匹配非空白字符 \S\S 匹配 ab, 12

量词(重复匹配)

量词控制前一项的数量

量词 说明 示例
* 0次或多次 a*b 匹配 b, aab
+ 1次或多次 a+b 匹配 ab, aaab 至少要出现一次
? 0次或1次 a?b 匹配 b, ab
恰好n次 a{2}b 匹配 aab
至少n次 a{2,}b 匹配 aab, aaaab
n到m次 a{2,3}b 匹配 aab, aaab

位置锚点

锚点 说明 示例
^ 匹配字符串开始 ^abc 匹配以abc开头的字符串
\(|匹配字符串结束|`abc\)` 匹配以abc结尾的字符串
\b 匹配单词边界 \babc\b 两个\b之间abc 匹配独立的abc单词
\B 匹配非单词边界 \Babc\B 匹配abc但不作为独立单词

字符类

使用[]定义,匹配其中任意一个字符

基本字符类

  • [abc]:匹配a、b或c
  • [a-z]:匹配a到z的任意小写字母
  • [A-Z]:匹配A到Z的任意大写字母
  • [0-9]:匹配0-9的数字 等同于\d

否定字符类

  • [^abc]:匹配不是a、b或c的任意字符
  • [^a-z]:匹配不是小写字母的任意字符

注意^在字符类[]中的行为与作为位置锚点时完全不同:

  • 在字符类内部且是第一个字符时,表示否定
  • 在字符类内部,但不在第一个字符时,表示字面量^匹配符号本身
  • 在字符类外部表示字符串/行的开始

字符类中的特殊字符

在字符类中,大多数元字符失去了特殊含义,变为字面值:

.*+?在字符类[]中都表示符号本身,不具有特殊含义

需要转义的字符:

    1. ^:如果出现在第一个字符位置表示否定,否则是字面值
    • [a^b]:匹配a、^或b
    • 如果要匹配单独的^字符需要进行转义
      • [\^] 匹配^字符
    1. -:用于表示范围,如a-z,如果要匹配字面值-:
    • 放在字符类的开头或结尾:[-a-z][a-z-] 匹配 -或a-z的小写字母
    • 或者进行转义:[a\-z] 匹配 a、- 或 z
    1. ]:表示字符类结束,要匹配字面值]需要:
    • 放在字符类的开头:[]abc] 匹配]、a、b、c 不推荐
    • 建议任何情况都进行转义 提高可读性 [abc\]]
    1. \:匹配斜杠本身需要转义\\

分组与捕获

在正则表达式中,括号()有两个主要作用:分组和捕获

捕获分组(pattern)

  • 将模式parttern作为一个分组
  • 匹配的内容会被捕获并存储
  • 可以通过反向引用\n或匹配结果数组访问
(ab)+  # 匹配一个或多个"ab"序列

如对于“abcababc”字符串

匹配结果为

["ab", "abab"]

捕获结果为

["ab", "abab"]

非捕获分组(?:pattern)

  • 只分组不捕获
  • 不会存储匹配内容
  • 提高性能,减少内存使用

当需要匹配"abc"序列时,但仅需要用到"ab"不需要"c"时

(ab)(:?c)+ # 匹配一个或多个"abc"序列 但仅捕获ab

同样对于“abcababcabc”字符串

匹配结果为

["abc", "abcabc"]

捕获结果为

["ab", "abab"]

反向引用

反向引用允许你引用前面捕获的分组:

  • \1引用第一个捕获组
  • \2引用第二个捕获组
  • 以此类推
(\d)\1 # 匹配相同的连续两个数字

如对于字符串"122344"

匹配结果为

["22", "44"]

分组中的量词

可以对整个分组应用量词

(ab){2,4}  # 匹配"abab", "ababab"或"abababab"
posted @ 2025-08-04 17:30  风陵南  阅读(20)  评论(0)    收藏  举报