本文为阅读《正则表达式必知必会》(修订版) 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"
功能有如下限制:
- 只提供搜索支持,不支持使用正则表达式进行替换操作。
- 默认搜索不区分字母大小写,需要在REGEXP和模式之间加BINARY关键字。
- [[:<:]]来匹配单词开头,用[[:>:]]匹配单词结束
- 不支持向前预测
- 不支持嵌入条件
- 不支持八进制字符搜索
- 不支持\a \b \e \f \v
- 不支持回溯引用
JAVA
Java中的正则表达式匹配功能主要是通过java.util.regex.Matcher类和以下这些方法实现的。
find(): 在一个字符串里寻找一个给定的模式匹配。
lookingAt(): 用一个给定的模式去尝试匹配一个字符串的开头。
matches(): 用一个给定的模式去尝试匹配一个完整的字符串。
replaceAll(): 进行替换操作,对所有匹配都进行替换。
replaceFirst(): 进行替换操作,只对第一个匹配进行替换。
java.util.regex.Pattern类提供了几个简单易用的包装器方法。
compile(): 把一个正则表达式编译成一个模式。
flags(): 返回某给定模式的匹配标志。
matches(): 在功能上等价于刚才介绍的matches()方法。
pattern(): 把一个模式还原为一个正则表达式。
split(): 把一个字符串拆分为子字符串。
java的正则表达式与Perl基本兼容,有几点需要注意。
- 不支持嵌入条件
- 不支持使用\E \l \L \u \U 进行字母大小写转换。
- 不支持使用[\b]匹配退格符。
- 不支持\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注释
<!-{2,}.*?-{2,}>
JavaScript注释
//.*
网友评论