精通正则表达式

部门内部培训的时候写的资料,系统化讲解了正则表达式,有点难理解,不明白的可以留言。

用途

正则表达式是一种匹配文本中字符序列的字符模式。

主要用途

  • 查找字符序列;
  • 对字符序列进行符合性测试。
  • 简单的归结一句话:判断一个字符序列是否与一个模式相匹配

使用场景

  • 文本编辑工具:vim、word等
  • Linux命令工具:sed、grep、目录匹配等
  • 开发语言:java、scala、python、mysql等

使用难点

  • 空格会导致含义改变
  • 没有统一的语法标准
  • 各种实现之间有差别
  • 不同环境下的字符含义不同
  • 一个问题对应多个解决方法 

语法

  • 直接量字符,特定的字母序列或者数字
  • 限定符,设定匹配的次数
  • 元字符,就是用于传达非自身含义的字符。
  • 修饰符,用来修饰如何完成搜索。
  • 字符类,字符类用于匹配字符集合中的任何一个字符
  • 位置元字符,匹配位置的元字符
  • 圆括号,可以创建一个或者多个字符边界

直接量字符

  • 匹配单个字符,只需要使用由相应的字符或者数字组成模式就可以。例如匹配大写字母A,用A模式就可以。
  • 匹配多个字符序列,多个字符序列组成的模式。例如匹配rr字符串的模式,用rr就可以。
  • 如果模式中不设定一个限定符来指定次数,默认模式中的字符或者字符序列恰好出现一次。

限定符

  • 匹配可选字符,?模式表示出现零次或者一次,例如,匹配sen和shen,可以用模式sh?en
  • *限定符,匹配零次或者多次。例如,abc,abc12,abc123三个字符串可以用模式abc[0-9]*
  • +限定符,匹配一次或者多次
  • {n},匹配多次abc[0-9]{3}
  • {n,m},最少匹配n次,最多匹配m次。例如{0,m},{n,}代表至少n次,最多无限次

元字符

  • 元字符,匹配任何字母字符,也可以匹配数字。优势是使用广泛、劣势替换是使用比较危险。
  • \w元字符,匹配英文字母字符、数字和下划线。不匹配象形文字,标点符号。
  • \W元字符,匹配\w不匹配的字符。
  • \d元字符,匹配0~9的数字
  • \D元字符,匹配\d不匹配的字符。
  • \s元字符,匹配任何单个空白字符。可以匹配一个空格符、一个制表符和一个换行符。
  • \S元字符,任何非空白字符,换行符能不能匹配根据具体设置
  • \t元字符,匹配制表符
  • \n元字符,匹配换号符
  • \元字符,可以用来转移元字符。例如\.代表直接量字符.

字符类

  • 两个字符选择,wen和ren字符可以用[wr]en模式匹配,这种情况也可以用圆括号表示。
  • 和限定符连用,字符串可以与限定符连用,注意AA23和BB19,[AB][0-9]*模式会匹配
  • \b、-、^、$在字符串中都要特殊含义,\b代表退格符、-代表分隔符、^代表取反,$代码本身
  • 字符类中使用范围,使用范围是模式更简单,例如[a-z]、[A-Z]、[0-9]、[a-zA-Z]、[A-z]
  • 反转字符范围,用^元字符对范围取反,例如[^a-z]代表匹配非[a-z]的字符,^不在首位代表字符本身。
  • -字符代表连接符,-放到[之后代表本身
  • 组合取反,[A-Z&&[^B-D]],匹配A-Z直接但是不在B-D之间

位置元字符

  • ^元字符,匹配一行或者字符串开始位置
  • $元字符,匹配一行或者字符串的结束位置
  • 匹配空白行,^$
  • \<元字符,匹配词的开始边界,它的前面包括一个非字母字符或者一行的开始
  • \>元字符,匹配词的结尾边界。
  • \b元字符,匹配词的边界
  • \B元字符,匹配非词的边界

圆括号

圆括号和限定符,例如,需要匹配多个字符出现多次,可以用圆括号包括字符和限定符结合,(A\d){3}可以匹配A1A2A3
交替选择,可以支持二选一和多选一,和|结合,|代表逻辑或的意思,例如(a|b)、(wen|wsl)

灵敏度和特殊性

  • 尽可能确保匹配想要匹配的文本和尽可能的匹配不想要匹配的文本
  • 灵敏性是指模式匹配的能力。特殊性是指模式选择的字符序列是所要选择的字符序列的能力
  • 灵敏度越高,则表明找到的真正匹配项数量接近要找的全部匹配项。而特殊性(针对性)越高,则表明找到的匹配项中正确的匹配项越多。
  • 正确的个数、找到的个数、要找的个数
  • 灵敏度=正确的/要找的,特殊性=正确的/找到的
  • 例如要找100个,实际找到150个,而其中有100个正确的,则灵敏性为100%,特殊性为66.7%
  • 极端的灵敏性和糟糕的特殊性,假设从文本中匹配ABC,使用模式.*,灵敏度很容易达到100%, 但是特殊性太差,会匹配所有的字符。
  • 灵敏度和特殊性的平衡,100%的灵敏性和100%的特殊性是理想状态。
  • 一般来说使用的元字符越多,特殊性越高,同时也有可能降低灵敏性。
  • 要了解处理的数据,只有真正了解数据才能提高灵敏性和特殊性。
  • 缩写词、非英文字符、拼写错误等都需要考虑

注意的问题

  • 代码中说明正则表达式的用意,同时要加注释
  • 表达式中不要使用多余的空格
  • 元字符在表达式中需要转义,使用\转义
  • 能使用字符串函数不要使用正则表达式,因为正则表达式容易出错、性能低

具体使用

word


Vim

  • Vim中使用/正则表达式进行搜索,使用:s/正则表达式/替换字符串/选项进行替换
  • 与标准语法区别

java

  • Java中使用java.util.regex包实现正则表达式
  • Pattern 对象是一个正则表达式的编译表示。
  • Matcher 对象是对输入字符串进行解释和匹配操作的引擎。。
  • PatternSyntaxException 是一个异常类,它表示一个正则表达式模式中的语法错误。
  • Java中基本支持正则表达式的标准语法

scala

  • Scala支持原生正则表达式,使用Regex类表示
  • Scala 的正则表达式继承了 Java 的语法规则

Mysql

  • Mysql中使用REGEXP操作符使用正则表达式
  • Mysql支持的语法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值