简介
概念
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和 特殊字符(称为 “元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个语法规则的字符串。
为什么使用正则表达式
典型的搜索替换操作,针对静态文本的任务虽然足够,但缺乏灵活性。典型的方法可使用于动态文本,但会变得很困难
通过使用正则表达式,可以
- 测试字符串内的模式
例如,测试输入字符串,以及查看字符串内容是否出现电话号码或信用卡号码模式。称之为数据验证 - 替换文本
可以使用正则表达式来识别文档中的特定文本,完全删除文本或者用其他文本替换它。 - 基于匹配模式从字符串中提取子字符串
可以查找文档内或输入域内特定的文本
语法
普通字符
普通字符包括没有显示指定元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
元字符
字符 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母、数字、下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
字符转义
查找元字符本身,例如查找 . 或 * ,就会出现问题。
这里无法指定它们,因为它们会被解释成别的意思。这里需要使用 \ 来取消这些字符的特殊意义。因此,应该使用 \. 和 \*。当然,查找 \ 本身,也得用 \\ 。
限定符
字符 | 说明 |
---|---|
* | 重复零次或多次 |
+ | 重复一次或多次 |
? | 重复零次或一次 |
{n} | 重复 n 次 |
{n, } | 重复 n 次或多次 |
{n, m} | 重复 n 到 m 次 |
*、+ 和 ? 限定符都是贪婪的,因为它们会尽可能的匹配文字,只有在它们的后面加上 ? 就可以实现非贪婪或最小匹配
例如,搜索 HTML 文档,以查找括在 H1 标记内的章节标题。文档如下:
<h1>Introduction to Regular Expressions</h1>
匹配从小于符号(<)开始到关闭 h1 标记的大于符号(>)之间的所有内容,表达式如下
<.*>
匹配开始的 h1 标记,下面是 ”非贪心“ 表达式
<.*?>
反义字符
字符 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除 x 以外的任意字符 |
反向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本可以在表达式或其他程序中进一步处理。默认情况下,每个分组会自动拥有一个组号,但(?:exp) 这样的语法会剥夺一个分组对组号分配的参与权。分组 0 对应整个正则表达式。
常用的分组语法
分类 | 符号 | 说明 |
捕获 | (exp) | 匹配 exp,并捕获文本到自动命名的组里 |
(?exp) | 匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?'name’exp) | |
(?:exp) | 匹配 exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配 exp 前面的位置 |
(?<=exp) | 匹配 exp 后面的位置 | |
(?!exp) | 匹配后面跟的不是 exp 的位置 | |
(?<!exp) | 匹配前面不是 exp 的位置 | |
注释 | (?#comment) | 用于提供注释让人阅读 |
零宽断言
(?=exp) 也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式 exp。比如 \b\w+(?=ing\b),匹配以 ing 结尾的单词的前面部分(除了 ing 以外的部分)。如查找 I’m singing,它会匹配 sing。
(?<=exp) 也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式 exp 。例如 (?<=\bre)\w+\b 会匹配以 re 开头的单词的后半部分(除了 re 以外的部分),例如在查找 reading a book 时,它会匹配 ading 。
负向零度断言
(?!exp) 零宽度负预测先行断言,断言位置的后面不能匹配表达式 exp。例如: \d{3}(?\d),能匹配三位数字,而且三维数字的后面不能是数字;\b((?!abc)\w)+\b 匹配不包含连续字符串 abc 的单词。
(?<!exp) 零宽度负回顾后发断言,断言位置的前面不能匹配表达式 exp。例如:(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字。