常用符号

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用\?

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