《正则表达式必知必会》
正则表达式是一些用来匹配和处理文本的字符串
有句话希望牢牢记住:把必须匹配的情况考虑周全并写出一个匹配结果符合预期的正则表达式很容易,但把不需要匹配的情况也考虑周全并确保它们都将被排除在匹配结果以外往往要困难得多。逻辑思维能力
(语法是正则表达式最容易掌握的部分,真正的挑战是学会如何运用那些语法把实际问题分解为一系列正则表达式并最终解决。)
基本用途
搜索和替换
元字符
有特殊含义的特殊字符
字符 | 功能 |
---|---|
. | 可以匹配任何一个单个的字符 |
\ | 转义 |
[] | 匹配多个字符中的某一个 |
- | 连字符,只用在[]之间,否则就是一个普通字符 |
^ | 取非匹配() |
+ | 匹配一个或多个字符 |
* | 匹配零个或多个字符 |
? | 匹配零个或一个字符 |
{} | 匹配的重复次数 |
{}的用法详解:
- 为重复匹配次数设定一个精确的值:{3}
- 为重复匹配次数设定一个区间:{2,4}
- 匹配至少重复多少次:{3,}
防止过度匹配
*
和+
都是所谓的“贪婪型”元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止的。它们会尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到的第一个匹配为止。
常用的贪婪型元字符和它们的懒惰型版本:
贪婪型元字符 | 懒惰型元字符 |
---|---|
* | *? |
+ | +? |
{n, } | {n, }? |
空白元字符
元字符 | 说明 |
---|---|
[\b] | 回退(并删除一个字符)(Backspace键) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab键) |
\v | 垂直制表符 |
匹配指定的字符类别
元字符 | 说明 |
---|---|
\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]) |
POSIX字符类
字符类 | 说明 |
---|---|
[:alnum:] | 任何一个字母或数字(等价于[a-zA-Z0-9]) |
[:alpha:] | 任何一个字母(等价于[a-zA-Z]) |
[:blank:] | 空格或制表符(等价于[\t]) |
[:cntrl:] | ASCII控制字符(ASCII0-31再加上ASCII127) |
[:digit:] | 任何一个数字(等价于[0-9]) |
[:graph:] | 和[:print:]一样,但不包括空格 |
[:lower:] | 任何一个小写字母(等价于[a-z]) |
[:print:] | 任何一个可打印字符 |
[:punct:] | 既不属于[:alnum:]也不属于[:cntrl:]的任何一个字符 |
[:space:] | 任何一个空白字符,包括空格(等价于[^\f\n\r\t\v]) |
[:upper:] | 任何一个大写字母(等价于[A-Z]) |
[:xdigit:] | 任何一个十六进制数字(等价于[a-fA-F0-9]) |