转义字符:\d
\D: 匹配任何一个非数字字符
点号:匹配任何字符,但一般不匹配行起始符
使用捕获分组(capturing group)来匹配电话号码中的某一部分。然后使用后向引用(backreference)对分组中的内容进行引用。要创建捕获分组,先将一个\d
放在一对圆括号中,这样就将它放入了一个分组中,后面可以用\1
来对捕获的内容进行后向引用:
(\d)\d\1
\1
对括号内分组捕获的内容进行了反向引用。这个正则表达式匹配的是区号707。以下是对该表达式的详细分析:
-
(\d)
匹配第一个数字并将其捕获(数字7); -
\d
匹配第二个数字(数字0)但没有捕获,因为没有括号; -
\1
对捕获的数字进行反向引用(数字7)。
加号(+
)表示“一个或多个”,星号(*
)表示“零个或多个”。
花括号中的数字表示待查找的数字出现的次数
非: [^0-9]非0-9之间的字符
\D
与\w
的区别是\D
会匹配空格、标点符号(引号、连字符、反斜杠、方括号)等字符,而\w
却不会,它只匹配字母、数字和下划线。
字符简写式
字符简写式 | 描述 |
---|---|
\a | 报警符 |
[\b] | 退格字符 |
\c x | 控制字符 |
\d | 数字字符 |
\D | 非数字字符 |
\o xxx | 字符的八进制值 |
\w | 单词字符 |
\W | 非单词字符 |
\0 | 空字符 |
\x xx | 字符的十六进制值 |
\u xxx | 字符的Unicode值 |
匹配各种空白符的简写式
字符简写式 | 描述 |
---|---|
\f | 换页符 |
\h | 水平空白符 |
\H | 非水平空白符 |
\n | 换行符 |
\r | 回车符 |
\s | 空白符 |
\S | 非空白符 |
\t | 水平制表符 |
\v | 垂直制表符 |
\V | 非垂直制表符 |
^
和
$
,也叫做
锚位符
(anchor)
\b匹配单词边界
还可以匹配非单词边界。非单词边界匹配除单词边界之外的位置,比如单词或者字符串中的字母或数字。要匹配一个非单词边界,试一下:
\Be\B
匹配空格和单词字符,可以创建这样一个字符组:
[\w\s]
它等同于:
[_a-zA-Z \t\n\r]
用下面的表达式查找0~99的偶数:
\b[24680]\b|\b[1-9][24680]\b
如果你想要两个字符组的并集,可以这样做:
[0-3[6-9]]
正则表达式处理器会匹配0到3之间的数字或者6到9之间的数字。
匹配差集(实质上就是减操作):
[a-z&&[^m-r]]
这匹配a到z之间的字符,但其中m到r之间的字符除外
基本量词
语法 | 描述 |
---|---|
? | 零个或一个(可选) |
+ | 一个或多个 |
* | 零个或多个 |
范围语法总结
语法 | 描述 |
---|---|
{n} | 精确匹配n次 |
{n,} | 匹配n次或更多次 |
{m,n} | 匹配m至n次 |
{0,1} | 与?相同 (零次或一次) |
{1,0} | 与+相同 (一次或更多) |
{0,} | 与*相同 (零次或更多) |
懒惰量词
语法 | 描述 |
---|---|
?? | 懒惰匹配零次或一次(可选) |
+? | 懒惰匹配一次或多次 |
*? | 懒惰匹配零次或多次 |
{n}? | 懒惰匹配n次 |
{n,}? | 懒惰匹配n次或多次 |
{m,n}? | 懒惰匹配m至n次 |
占有量词就是在普通量词之后添加一个加号(+)。它不“咀嚼”而是直接“吞咽”,然后才想知道“吃”的是什么。
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
例子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串。
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) | |
(?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 | |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 | |
(?!exp) | 匹配后面跟的不是exp的位置 | |
(?<!exp) | 匹配前面不是exp的位置 | |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |