Note on Regular Expression
常用符号
?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ?
字符,请使用\?
used?
可以匹配到 “use” 或者 “used”
*
匹配前面的子表达式零次或多次。要匹配 *
字符,请使用 \*
ab*c
可以匹配到 “ac”, “abc”, “abbbbc” 等
+
匹配前面的子表达式一次或多次。要匹配 +
字符,请使用 \+
ab+c
可以匹配到 “abc”, “abbbbc” 等
如果要精确指示字符出现的次数,可以使用花括号
ab{3}c
只会匹配到 “abbbc”
ab{2,6}c
会匹配到 “abbc”, “abbbc”, “abbbbc”, “abbbbbc”, “abbbbbbc”
ab{2,}c
会匹配到 “abbc”, “abbbc” 等 “b” 出现次数大于等于 2 的字符
( )
标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \(
和 \)
或运算
|
指明两项之间的一个选择。要匹配 |
,请使用 \|
a (cat|dog)
会匹配到 “a cat” 和 “a dog”
a cat|dog
会匹配到 “a cat” 和 “dog”
字符类
[abc]+
会匹配到由 “abc” 三个字母组成的字符
方括号里的内容代表要求匹配的字符只能取自于它们
可以在方括号中指定字符范围,比如 [a-z]+
表示所有小写的英文字符, [a-zA-Z]+
表示所有的英文字符,[a-zA-Z0-9]+
表示所有的英文字符和数字
如果在方括号前面(内部)写一个尖号(脱字符),则意味着要匹配除了尖号后面列出的以外的字符,比如 [^0-9]+
表示所有的非数字字符(包括换行符)
元字符
\d
代表数字字符,等同于 [0-9]
\w
代表单词字符,即所有的英文字符、数字和下划线
\s
代表空白符,同时包含 Tab 字符(制表符)和换行符
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, er\b
可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’
\D
代表非数字字符,等同于 [^0-9]
\W
代表非单词字符
\S
代表非空白字符
\B
匹配非单词边界。er\B
能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’
.
代表除了换行符以外的任意字符,
^
匹配行首,比如 ^a
只会匹配以 “a” 为首的字符
只会匹配 “a” 结尾的字符
贪婪与懒惰匹配
*
, +
, {}
在匹配字符串的时候,会默认去匹配尽可能多的字符,比如,当我们想要筛选出 <span><b>This is a sample text</b></span>
中的 HTML 标签时,会使用 <.+>
,但这个正则表达式会直接匹配整个字符串。因为中间的这个 .+
会匹配尽可能多的字符,但是 .
能代表任意字符,包括 >
,因此会出现这种结果。
解决方法是使用 <.+?>
,这个 ?
会把正则表达式中默认的贪婪匹配(Greedy Match)切换为懒惰匹配(Lazy Match)
实例
RGB 颜色值匹配
#[a-fA-F0-9]{6}\b
IPv4 地址匹配
\b((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)\b