部门内部培训的时候写的资料,系统化讲解了正则表达式,有点难理解,不明白的可以留言。
用途
正则表达式是一种匹配文本中字符序列的字符模式。
主要用途
- 查找字符序列;
- 对字符序列进行符合性测试。
- 简单的归结一句话:判断一个字符序列是否与一个模式相匹配
使用场景
- 文本编辑工具: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支持的语法