Better

Ethan的博客,欢迎访问交流

正则表达式的基本使用

正则真是个神奇的东西,每次学习都有新的感觉,但却一直都不太会……

什么是正则

非常强大的文本处理工具

  • 校验数据的有效性
  • 从文本中提取内容
  • 文本内容的替换

元字符

基础的元字符:正则表达式中具有特殊含义的那些专用的字符

元字符分类

  • 基础
    • · 表示换行以外的任意字符
    • \d 任意数字,\D 任意非数字
    • \w 任意数字字母下划线 \W 数字字母下划线以外的任意字符
    • \s 任意空白符 \S 任意非空白符
  • 空白符
    • \r 回车符
    • \n 换行符
    • \f 换页符
    • \t 制表符
    • \v 垂直制表符
  • 范围
    • | 管道符号,表示满足其中任意一个即可
    • [...] 多选一,括号中任意单个元素
    • [a-z] 匹配 a-z 之间任意单个元素,按照 ASCII 表
    • [^...] 取反,不能是括号中的任意单个元素
  • 边界
    • ^ 匹配行的开始,多行模式时,可以匹配任意行开头
    • $ 匹配行的结束,多行模式时,可以匹配任意行结尾
    • \b 匹配单词边界
    • \A 仅匹配整个字符串的开始,不支持多行模式
    • \Z 仅匹配整个字符串的结束,不支持多行模式
  • 量词
    • * 表示 0 到多次
    • + 表示 1 到多次
    • ? 表示 0 到 1 次
    • {m} 出现 m 次
    • {m, n} 出现 m 到 n 次
    • {, n} m 不写不是 0,至多 n 次
    • {m, n} n 不写表示无穷大,至少 m 次

贪婪与非贪婪

正则表达式中,表示次数的量词,默认是贪心的,尽可能多的去匹配符合要求的内容

  • 默认时贪婪的
  • 非贪婪:数量的元字符后加 ?(英文问号),找出长度最小且满足要求的

环视

当我们想要对提取字符串的左边或者右边的环境有要求的时候,比如查找左边是数字的字母

环视就是对于我们给定的规则前或规则后加一些限制

  • (?<=Y)X 匹配前面是 Y 的 X
  • (?<!Y)X 匹配前面不是 Y 的 X
  • X(?=Y) 匹配后面是 Y 的 X
  • X(?!Y) 匹配后面不是 Y 的 X

子组

子组:将正则分成若干个小组

  • (正则) 将 regex 保存成一个子组
  • (?P<name>正则) 命名子组,将 regex 保存成名词为 name 的子组
  • (?:正则) 仅分组,不保存这个子组
  • \分组编号 重复某个子组,从 1 开始编号

子组功能

  • 某个部分的内容在后面重复出现
  • 对某个部分的内容进行替换

flag

正则匹配的时候可以指定 flag,比如

  • . 可以匹配所有字符,包括换行
  • 多行的匹配模式
  • 大小写不敏感的匹配模式
  • ……

资源

推荐书籍:精通正则表达式(第三版)



留言