正则表达式
Posted dongye95
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。
Micbael·Fitzgerald 人民邮电出版社
第 1 章 什么是正则表达式
正则表达式有助于找到文本字符串中的各种模式。更确切地说,正则表达式是经过专门编写的文本字符串,用来匹配字符串(尤其是文件内字符串)集合中符合该模式的所有字符串。
正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。
707-827-7019这种正则表达式是用 字符串字面值 (string literal)
来匹配目标字符串的。
字符串字面值: 字面上看起来是什么就是什么。
正则表达式将方括号视为特殊的 元字符(metacharacter)
,因此方括号不参与匹配。
元字符: 在正则表达式中有特殊含义的字符,也是保留字符。
[0-9]这种形式的正则表达式称做 字符组(charactercla ss)
,有时也叫 字符集(characterset)
。
可以对数字的范围进行进一步限定。用更具体的一组数字也能得到同样的结果,比如[12789],这个字符组只会匹配列出的数字,即1、2、7、8、9。d
可以匹配任意阿拉伯数字。
这种正则表达式叫做 字符组简写式(character shorthand)
,也叫 转移字符(character escape)
。
可以使用以下表达式来匹配电话号码中的任意数字:ddd-ddd-dddd除了和上面表达式一样,使用连字符本身(-)来匹配连字符之外,也可以用转义的大写D(D)。它匹配任何一个非数字字符。dddDdddDdddd
还可以用点号(.)来匹配连字符ddd.ddd.dddd点号(英文句号)是一个通配符,可以匹配任意字符(但某些情况下不能匹配行起始符)。它也可以匹配百分号(%)或竖线(|)ddd%ddd%ddddddd|ddd|dddd
本节我们使用捕获分组(capturing group)来匹配电话号码中的某一部分。然后使用后向引用(backreference)对分组中的内容进行引用。要创建捕获分组,先将一个d放在一对圆括号中,这样就将它放入了一个分组中,后面可以用1来对捕获的内容进行后向引用:(d)d11对括号内分组捕获的内容进行了反向引用。这个正则表达式匹配的是区号707。
-
(d)匹配第一个数字并将其捕获(数字7)
-
d匹配第二个数字(数字0)但没有捕获,因为没有括号
-
1对捕获的数字进行反向引用(数字7)
707-827-7019(d)01Ddd1D1dddd{3}-?d{3}-?d{4}花括号中的数字表示待查找的数字出现的次数。包含数字的花括号是一种量词(quantifier)。花括号本身用做元字符。
问号是另一种量词,在以上表达式中表示连字符是可选的。也就是说,连字符可以不出现或只出现一次。还有其他的量词,例如加号(+)表示“一个或多个”,星号(*)表示“零个或多个”使用量词能让正则表达式变得更简洁:
(d{3,4}[.-]?)+
-
左圆括号 ( 为捕获分组的起始符
-
反斜杠 为字符组简写式的起始符(对之后的字符进行转义)
-
字符d为字符组简写式的结束符(d匹配0到9范围内的任意数字),
-
左花括号 { 为量词起始符;
-
数字3为匹配的最小数量;
-
逗号 , 隔开不同的数量;
-
数字4为匹配的最大数量;
-
右花括号 } 为量词的结束符;
-
左方括号 [ 为字符组的起始符;
-
点号 . (匹配点号本身);
-
连字符 - 匹配连字符的本身;
-
右方括号 ] 为字符组的结束符;
-
问号 ? 表示量词“零个或一个“;
-
右圆括号 ) 为捕获分组的结束符;
-
加号 + 表示量词“一个或多个“。
这个表达式能用但不完全对,因为它只能匹配3位或4位的数字,而不管是否符合电话号码的格式。改进:(d{3}[.-]?){2}d{4}这个表达式匹配的字符串是连续两个无括号的三位数字,每三位数字后可以带连字符也可以不带,最后是一个四位数字。
括选文字符最后这个正则表达式表示第一个3位数字可以带也可以不带括号,即区号是可选的:
^((d{3})|^d{3}[.-]?)?d{3}[.-]?d{4}$
-
出现在正则表达式起始位置或者竖线(|)之后的脱字符^,表示电话号码会出现在一行的起始位置;
-
左括号 ( 为捕获分组的起始符;
-
(表示左括号本身;
-
d匹配一位数字,
-
d之后的{3}是量词,表示匹配三位数字;
-
)匹配右括号本身;
-
竖线符|表示选择,也就是从多个可选项中选择一个,换句话说,它表示“匹配一个不带括号的区号或一个带括号的区号“;
-
脱字符 ^ 匹配行起始位置;
-
d匹配一位数字,
-
{3}是表示匹配三位数字的量词;
-
[.-]? 匹配一个可选的点号或连字符;
-
右括号 ) 为捕获分组的结束符,
-
问号 ? 表示分组可选,即分组中的前缓可有可无;
-
d匹配一位数字;
-
{3}表示匹配三位数字的量词;
-
[.-]?匹配另一个可选的点号或连字符;
-
d匹配一位数字;
-
{4}是表示匹配四位数字的量词:
-
美元符$匹配行结束位置。
这个表达式最终匹配十位的北美电话号码,而且括号、连字符或者点号都是可选的。
以上正则表达式中的捕获分组并不是必需的。分组是必要的,但是捕获不需要,更好的方法是使用非捕获分组。(之后才讨论)
为什么有那么多编写正则表达式的方法?一个原因是正则表达式具有可组合性(composability)。
第 2 章 简单的模式匹配
正则表达式唯一的用途就是在文本中匹配和寻找模式,模式可以简单也可以复杂。
2.1 匹配字符串字面值
正则表达式最为直接和明显的功能就是用一个或多个字符字面值来匹配字符串。
2.2 匹配数字
d 和 [0-9]效果是一样的字符组[0-9]表示范围,这意味着它会匹配0至9范围内的数字。数字的字符组简写式d更为简短,但却没有字符组强大、灵活。在无法使用d时(不是所有情况下都支持这种方式),或者想匹配特定数字时,就需要使用字符组,合适的时候可以使用d,因为它更简短。
2.3 匹配非数字字符
通常可以将简写式取反,取反的结果就是排除。比如,要匹配非数字字符,可使用包含以下大写字母D的简写式:D[^0-9][^d]
2.4 匹配单词和非单词字符
wD与w的区别是D会匹配空格、标点符号(引号、连字符、反斜杠、方括号)等字符,而w却不会,它只匹配字母、数字和下划线。在英语环境中,与w匹配相同内容的字符组为:[_a-zA-Z0-9]现在用大写字母W匹配非单词字符:W相当于[^_a-zA-Z0-9]
字符简写式 | 描述 |
---|---|
a | 报警符 |
[] | 退格字符 |
c x | 控制字符 |
d | 数字字符 |
D | 非数字字符 |
o xxx | 字符的八进制 |
w | 单词字符 |
W | 非单词字符 |