美文网首页
正则基础

正则基础

作者: Tinyspot | 来源:发表于2023-01-08 23:01 被阅读0次

1. 正则

  • 正则是一种描述文本内容组成规律的表示方式
  • 作用
    • 校验数据的有效性
    • 查找符合某个规则的文本
    • 对文本进行切割和替换

1.1 符号

  • 脱字符(^)表示非

2. 元字符(Metacharacter)

  • - [ ] ^ $
  • \b 匹配单词边界,如 \w+\b
  • 完整匹配: ^ 和 $

2.1 特殊单字符

  • 点号. 匹配任意单个字符(换行除外)
    • 匹配自身加转义 \.
  • \d 任意单个数字 [0-9]
    • \D 任意非数字 [^0-9]
  • \w 字母+数字+下划线 [A-Za-z0-9_]
    • \W 非\w
    • \w+ 一般用来匹配单词
  • 匹配单词 [a-z]+\w+\w+\b

2.2 空白符

  • \s 能匹配上各种空白符号,也可以匹配上空格
    • 空白字符,包括但不限于空格,制表符,换行 [\f\n\r\t\v]
  • \r 回车
  • \n 换行
  • \t 制表符
  • \v 垂直制表符
  • \f 换页

2.3 量词(匹配多个字符)

  • ? 表示可选字符 {0,1}
  • + {1,}
  • * {0,}
  • {m,n} 重复区间,代表 m 到 n 次,m是下限,n是上限(均为闭区间)
    • \d{2,3} 先按贪婪模式匹配,12345-12345
    • \d{2,3}? 非贪婪模式,只匹配 2 个数字
  • 注意:量词中的逗号之后不能有空格

匹配任意数据 .*?
(.|\n)*, (.|\s)*

2.4 范围

  • 管道符号(|)或,如:ab|cd
  • [...] 字符集合,也称自定义通配符
    • [] 只匹配一个字符,多选一,如 [Jj]ava 匹配 Java or java
    • 字符区间可以用连字符(-), 如 [b-o-x];若要匹配横线,加转义 [\-]
    • [^...], ^作用于字符集合里的所有字符或字符区间
    • 点放入 [] 可以不加转义,如 [.]
    • 匹配中文用Unicode graphemica.com/

3. 量词与贪婪

  • 贪婪模式,尽可能进行最长匹配
  • 非贪婪模式,则会尽可能进行最短匹配
  • +, *是贪婪匹配,但是为了整体匹配,在适当情况下会少匹配些,贪婪模式要让位于整体匹配
  • 加上?表示非贪婪,示例.+?, 非贪婪模式也会让位于整体匹配 所以某些情况会多匹配些

3.1 贪婪匹配(Greedy)

  • 在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配

对比 a+a*
a* 匹配了三次空字符串,因为星号(*)代表 0 到多次,匹配 0 次就是空字符串

image.png

3.2 非贪婪匹配(Lazy)

  • 在量词后面加上英文问号 (?),可将贪婪模式变成非贪婪模式
image.png

3.3 独占模式(Possessive)

  • 不管是贪婪模式,还是非贪婪模式,都需要发生回溯才能完成相应的功能
  • 量词后面加上加号(+)
  • 独占模式和贪婪模式很像,独占模式会尽可能多地去匹配,如果匹配失败就结束,不会进行回溯,这样的话就比较节省时间

字符 xyyz
xy{1,3}z 首先匹配 3 个 y, 但正则 z 会匹配不上,此时正则向前回溯,吐出当前字符 z,接着用正则中的 z 去匹配

image.png

xy{1,3}?z 首先匹配 1 个 y, 但 z 会匹配不上,此时向前回溯...

独占模式xy{1,3}+yz 不能匹配到 xyyz

3.4 贪婪分析

  • dxxxxdxxxd - d.+d 虽然让位于整体匹配,但也是在尽可能多的匹配情况下
  • dxxxxdxxxd - d.+? - 会匹配两个 dx
  • dxxxxdxxxd - d.+?d - 匹配一个dxxxxd

相关文章

网友评论

      本文标题:正则基础

      本文链接:https://www.haomeiwen.com/subject/vckpcdtx.html