正则表达式学习笔记

本文为阅读《正则表达式必知必会》(修订版) Ben Forta著 杨涛等译 总结所得,以备后用,内容来自此书。

正则表达式是一些用来匹配和处理文本的字符串。
正则表达式的两种基本用途:搜索和替换。

匹配单个字符

符号 作用
[\b] 回退Backspace
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
\r\n windows系统文本行结束标识
\d 任何一个数字字符,等价于[0-9]
\D 任何一个非数字字符,等价于[^0-9]
\w 任何一个字母数字下划线,等价于[a-zA-Z0-9_]
\W 任何一个非字母数字下划线,等价于[^a-zA-Z0-9_]
\s 任何一个空白字符,等价于[\f\n\r\t\v],退格符例外
\S 任何一个非空白字符,等价于[^\f\n\r\t\v],退格符例外

英文字符.来表示任意字符,特殊字符需要用反斜杠转义(\)

符号 作用
[\b] 回退Backspace
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\v 垂直制表符
\r\n windows系统文本行结束标识
\d 任何一个数字字符,等价于[0-9]
\D 任何一个非数字字符,等价于[^0-9]
\w 任何一个字母数字下划线,等价于[a-zA-Z0-9_]
\W 任何一个非字母数字下划线,等价于[^a-zA-Z0-9_]
\s 任何一个空白字符,等价于[\f\n\r\t\v],退格符例外
\S 任何一个非空白字符,等价于[^\f\n\r\t\v],退格符例外

匹配一组字符

利用[]表示字符集合,匹配之间的某一个字符
[]之间也可以放字符区间表示匹配范围内的某一个字符

符号 作用
A-Z 匹配从A到Z的所有大写字母
a-z 匹配从a到z的所有小写字母
A-z 匹配ASCII码从大写A到小写z之间的所有字符,不常用

可以定义多个区间[A-Za-z0-9]
取非匹配[^0-9],表示匹配任何不是数字的字符

重复匹配

匹配重复的字符1个或多个用+号
匹配重复的字符0个或多个用*号
匹配0个或1个字符用?号
指定重复次数{次数}
指定匹配次数的变化区间{2,4}表示最少重复2次,最多重复4次;{3,}表示至少重复3次
元字符分为贪婪型元字符和懒惰型元字符,贪婪型匹配尽可能多的字符,懒惰型匹配尽可能多的字符,懒惰型元字符为贪婪型后加个?,如*为贪婪型字符,对应的懒惰型字符为*?,为了防止过度匹配,可以使用懒惰型元字符。

位置匹配

单词的边界 \b
字符串的 边界 ^和$ 以字符开始和结束
(?m)开头表示分行匹配

子表达式

子表达式必须用()括起来,子表达式允许嵌套,层数没有限制,表达式之间的或条件用 | 来表示

回溯引用

回溯引用允许正则表达式模式引用前面的匹配结果,模式的后半部分引用在前半部分中定义的子表达式,用\1 \2 ...来表示,1,2,3表示子表达式的位置,回溯表达式相当于引用变量。回溯表达式通常用1开始计数,在许多实现里,用0来代表整个正则表达式。

回溯替换操作

替换操作需要用到两个正则表达式:一个用来给出搜索模式,另一个用来给出匹配文本的替换模式。回溯引用可以跨模式使用,在第一个模式里被匹配的子表达式可以用在第二个模式里。

前后查找

操作符 作用
(?=) 正向前查找
(?!) 负向前查找
(?<=) 正向后查找
(? 负向后查找

匹配网页标题

(?<=<[Tt][Ii][Tt][Ll][Ee]>).*(?=<[Tt][Ii][Tt][Ll][Ee]>)

嵌入条件

正则表达式里的条件用?来定义。
?匹配前一个字符或表达式,如果存在的话。
?=和?<=匹配前面或后面的文本,如果存在的话。

MySQL

MySQL对正则表达式的支持体现在允许在WHERE子句中使用如下格式的表达式:

REGEXP "expression"

功能有如下限制:

  1. 只提供搜索支持,不支持使用正则表达式进行替换操作。
  2. 默认搜索不区分字母大小写,需要在REGEXP和模式之间加BINARY关键字。
  3. [[:<:]]来匹配单词开头,用[[:>:]]匹配单词结束
  4. 不支持向前预测
  5. 不支持嵌入条件
  6. 不支持八进制字符搜索
  7. 不支持\a \b \e \f \v
  8. 不支持回溯引用

JAVA

Java中的正则表达式匹配功能主要是通过java.util.regex.Matcher类和以下这些方法实现的。

find(): 在一个字符串里寻找一个给定的模式匹配。
lookingAt(): 用一个给定的模式去尝试匹配一个字符串的开头。
matches(): 用一个给定的模式去尝试匹配一个完整的字符串。
replaceAll(): 进行替换操作,对所有匹配都进行替换。
replaceFirst(): 进行替换操作,只对第一个匹配进行替换。

java.util.regex.Pattern类提供了几个简单易用的包装器方法。

compile(): 把一个正则表达式编译成一个模式。
flags(): 返回某给定模式的匹配标志。
matches(): 在功能上等价于刚才介绍的matches()方法。
pattern(): 把一个模式还原为一个正则表达式。
split(): 把一个字符串拆分为子字符串。

java的正则表达式与Perl基本兼容,有几点需要注意。

  1. 不支持嵌入条件
  2. 不支持使用\E \l \L \u \U 进行字母大小写转换。
  3. 不支持使用[\b]匹配退格符。
  4. 不支持\z。

常见问题的正则表达式解决方案

IP地址

(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])) 

URL地址

(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]

电子邮件地址

(\w+\.)*\w+@(\w+\.)+[A-Za-z]+

HTML注释


JavaScript注释

//.*

你可能感兴趣的:(正则表达式学习笔记)