正则表达式
1. 概念
正则表达式是程序员们经常用来做字符串匹配的重要工具,其基本元字符大家应该都熟悉,但一些较高级的能明显提高逼格的高级匹配方法也许有助于你更好的完成你的字符匹配需求。
2. 基本元字符
正则表达式的基本元字符构成了正则引擎的基本元素,也是最需要熟悉的。下表是一个总结。
元字符 | 含义 | 使用示例 | 示例含义 |
元字符 | |||
. | 任意字符 |
|
|
\b | 单词的开始或结束 |
|
|
\s | 空白字符,包含空格,tab,换行 |
|
|
\w | 字母、数字、下划线、汉字,等同于[_0-9a-ZA-Z] |
|
|
\d | 数字字符,等同于[0-9] |
|
|
^ | 字符串的开始 |
|
|
$ | 字符串的结尾 |
|
|
重复 | |||
? | 0次或1次 |
|
|
* | 0次或多次 |
|
|
+ | 1次或多次 |
|
|
{n} | n次 |
|
|
{n,m} | n-m次 |
|
|
{n,} | n-多次 |
|
|
字符集 | |||
[] | 自定义字符集 | [abcde] | abcde中的任意1个字符 |
- | 字符范围 | [a-z] | a-z的任意1个字符 |
分支条件 | |||
| | 分支,或 | abc|def |
|
分组 | |||
() | 分组字符串 | (abc){2} | abcabc |
反义 | |||
^ | 非 | [^xyz] | 除了xyz外的任何字符 |
\D | 非数字 |
|
|
\B | 非单词边界 |
|
|
\W | 非字符 |
|
|
\S | 非空白 |
|
|
3. 高级知识
后向引用:当前面的正则匹配了一个字符串后,想引用该字符串作为正则的一部分,该功能与分组同时用,每个分组从左到右按1、2…编号,使用时\1或\2编号即可,比如(\d\d)\.\1,匹配12.12
其他更高级的引用包括:
分类 | 代码/语法 | 说明 |
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
其中零宽断言比较有意思,他匹配的是与特征相关的地方,而不是特征本身。
贪婪与懒惰:正则里的重复字符匹配时有贪婪和懒惰之分,贪婪指尽可能多的匹配字符,懒惰指尽可能少的匹配字符。正则引擎一般默认是贪婪匹配,如果要用懒惰匹配,需要在重复元字符后加上’?’.
4. 工具
目前用到最好用的工具还是regexbuddy,它支持实时的正则语义解析和高亮匹配功能:
可自动生成各种逻辑的正则匹配代码
自带很多正则匹配库,比如匹配URL
5. References
A. http://www.jb51.net/tools/zhengze.html