第 1 章 正则表达式
1.1 简介/动机
1.2 特殊符号和字符
常见正则表达式符号和特殊字符
表 示 法 |
描 述 |
正则表达式示例 |
符号 |
|
|
literal |
匹配文本字符串的字面值 literal |
foo |
re1|re2 |
匹配正则表达式 re1 或者 re2 |
foo|bar |
. |
匹配任何字符(除了\n 之外) |
b.b |
^ |
匹配字符串起始部分 |
^Dear |
$ |
匹配字符串终止部分 |
/bin/*sh$ |
* |
匹配 0 次或者多次前面出现的正则表达式 |
[A-Za-z0-9]* |
+ |
匹配 1 次或者多次前面出现的正则表达式 |
[a-z]+.com |
? |
匹配 0 次或者 1 次前面出现的正则表达式 |
goo? |
{N} |
匹配 N 次前面出现的正则表达式 |
[0-9]{3} |
{M,N} |
匹配 M~N 次前面出现的正则表达式 |
[0-9]{5,9} |
[…] |
匹配来自字符集的任意单一字符 |
[aeiou] |
[..x−y..] |
匹配 x~y 范围中的任意单一字符 |
[0-9], [A-Za-z] |
[\^…] |
不匹配此字符集中出现的任何一个字符,包括某一范围的字符(如果在此字符集中出现) |
[\^aeiou], [\^A-Za-z0-9] |
(*|+|?|{})? |
用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、 +、 ?、 {}) |
.*?[a-z] |
(…) |
匹配封闭的正则表达式,然后另存为子组 |
([0-9]{3})?,f(oo |
特殊字符 |
|
|
\d |
匹配任何十进制数字,与[0-9]一致(\D 与\d 相反,不匹配任何非数值型的数字) |
data\d+.txt |
\w |
匹配任何字母数字字符,与[A-Za-z0-9_]相同(\W 与之相反) |
[A-Za-z_]\w+ |
\s |
匹配任何空格字符,与[\n\t\r\v\f]相同(\S 与之相反) |
of\sthe |
\b |
匹配任何单词边界(\B 与之相反) |
\bThe\b |
\N |
匹配已保存的子组 N(参见上面的(…)) |
price: \16 |
\c |
逐字匹配任何特殊字符 c(即,仅按照字面意义匹配,不匹配特殊含义) |
\., \\, \* |
\A(\Z) |
匹配字符串的起始(结束)(另见上面介绍的^和$) |
\ADear |
扩展表示法 |
|
|
(?iLmsux) |
在正则表达式中嵌入一个或者多个特殊“标记” 参数(或者通过函数/方法) |
(?x),(?im) |
(?:…) |
表示一个匹配不用保存的分组 |
(?:\w+.)* |
(?P<name>…) |
像一个仅由 name 标识而不是数字 ID 标识的正则分组匹配 |
(?P<data>) |
(?P=name) |
在同一字符串中匹配由(?P<name)分组的之前文本 |
(?P=data) |
(?#…) |
表示注释,所有内容都被忽略 |
(?#comment) |
(?=…) |
匹配条件是如果…出现在之后的位置,而不使用输入字符串;称作正向前视断言 |
(?=.com) |
(?!…) |
匹配条件是如果…不出现在之后的位置,而不使用输入字符串;称作负向前视断言 |
(?!.net) |
(?<=…) |
匹配条件是如果…出现在之前的位置,而不使用输入字符串;称作正向后视断言 |
(?<=800-) |
(?<!…) |
匹配条件是如果…不出现在之前的位置,而不使用输入字符串;称作负向后视断言 |
(?<!192.168.) |
(?(id\/name)Y|N ) |
如果分组所提供的 id 或者 name(名称)存在,就返回正则表达式的条件匹配 Y,如果不存在,就返回 N; |N 是可选项 |
(?(1)y|x) |
1.2.1 使用择一匹配符号匹配多个正则表达式模式
正则表达式模式 |
匹配的字符串 |
at|home |
at、 home |
r2d2|c3po |
r2d2、 c3po |
bat|bet|bit |
bat、 bet、 bit |
1.2.2 匹配任意单个字符
正则表达式模式 |
匹配的字符串 |
f.o |
匹配在字母“f”和“o”之间的任意一个字符;例如 fao、 f9o、 f#o 等 |
.. |
任意两个字符 |
.end |
匹配在字符串 end 之前的任意一个字符 |
1.2.3 从字符串起始或者结尾或者单词边界匹配
正则表达式模式 |
匹配的字符串 |
^From |
任何以 From 作为起始的字符串 |
/bin/tcsh$ |
任何以/bin/tcsh 作为结尾的字符串 |
^Subject: hi$ |
任何由单独的字符串 Subject: hi 构成的字符串 |
the |
任何包含 the 的字符串 |
\bthe |
任何以 the 开始的字符串 |
\bthe\b |
仅仅匹配单词 the |
\Bthe |
任何包含但并不以 the 作为起始的字符串 |
1.2.4 创建字符集
正则表达式模式 |
匹配的字符串 |
b[aeiu]t |
bat、 bet、 bit、 but |
[cr][23][dp][o2] |
一个包含四个字符的字符串,第一个字符是“c”或“r”,然后是“2”或“3”,后面是“d”或“p”,最后要么是“o”要么是“2”。例如, c2do、 r3p2、 r2d2、 c3po 等 |
1.2.5 限定范围和否定
正则表达式模式 |
匹配的字符串 |
z.[0-9] |
字母“z”后面跟着任何一个字符,然后跟着一个数字 |
[r-u][env-y][us] |
字母“r”、“s”、“t”或者“u”后面跟着“e”、“n”、“v”、“w”、“x”或者“y”,然后跟着“u”或者“s” |
[^aeiou] |
一个非元音字符(练习:为什么我们说“非元音”而不是“辅音”?) |
[^\t\n] |
不匹配制表符或者\n |
[“-a] |
在一个 ASCII 系统中,所有字符都位于“”和“a”之间,即 34~97 之间 |
1.2.6 使用闭包操作符实现存在性和频数匹配
星号或者星号操作符(*)将匹配其左边的正则表达式出现零次或者多次的情况(在计算机编程语言和编译原理中,该操作称为 Kleene 闭包)。加号(+)操作符将匹配一次或者多次出现的正则表达式(也叫做正闭包操作符),问号(?)
操作符将匹配零次或者一次出现的正则表达式。
还有大括号操作符({}),里面或者是单个值或者是一对由逗号分隔的值。这将最终精确地匹配前面的正则表达式 N 次(如果是{N})或者一定范围的次数;例如, {M, N}将匹配 M~N 次出现。这些符号能够由反斜线符号转义; *匹配星号,等等。
注意,在之前的表格中曾经多次使用问号(重载), 这意味着要么匹配 0 次,要么匹配 1次,或者其他含义:如果问号紧跟在任何使用闭合操作符的匹配后面, 它将直接要求正则表达式引擎匹配尽可