正则表达式可以被视作是增强版的通配符,可以匹配制定规则的字符串。
练习方法
可以在编译器中自带的查找功能尝试,也可以在 regex101.com 在线测试工具中尝试。
限定符 Quantifiers
? 表示前面的字符需要出现0次或1次。
如:used?
可以匹配 use 和 used.
* 表示前面的字符需要出现0次或多次。
如:ab*c
会匹配ac、abc、abbbc……但不能匹配到 adc。
+ 表示前面的字符需要出现1次或多次。
如上例,ab+c
不会匹配 ac。
{数字} 表示前面的字符需要出现多少次。
如:ab{6}c
表示 abbbbbbc,ab{2,6}c
表示b出现2~6次,ab{2,}c
表示b出现2次以上。
() 用于限定多个字符。
如:(ab)?c
表示c或abc。
或运算 or
a (cat|dog)
表示 a cat 或 a dog.括号不能少
字符类 Character Classes
[]+,用于匹配单词,单词的字符只能取自方括号内。
如:[abc]+
表示只由 abc 组成的字符,aabbcc
等。
[a-z]+
表示所有小写字母
[a-zA-Z]+
表示所有字母
[0-9]+
表示所有数字
方括号内加^表示取反,如[^a-z]+
表示所有非小写字母的字符(甚至包括换行符)
元字符 Meta-characters
\d:数字字符
\D:非数字字符
\w:单词字符(英文字符、数字字符、下划线)
\W:非单词字符
\s:空白字符(Tab、空格、换行符)
\S:非空白字符
\b:单词字符的边界,相当于文本的开头或结束。
.:任意字符(不包括换行符)
^:匹配行首,如^a
只会匹配出现在行开头的a
$:匹配行尾,如a$
只会匹配出现在行结尾的a
反斜杠用在符号前还可以做转义,如\.
表示.字符。
贪婪与懒惰匹配 Greedy vs Lazy Match
<span><b>This is a simple text</b></span>
如果想匹配所有的标签,也就是匹配<>,中间的内容是一个或多个任意字符。
<.+>
但是这样匹配,会把整行都匹配起来,而不是每个标签单独匹配。这就是贪婪匹配,会尽可能多地匹配。因为.也会匹配>号。
<.+?>
例: IP 地址
IP 地址形如 192.168.0.1
由四部分数字和三个.组成,每部分数字都不能大于255.
首先表示出四部分数字+3个.的形式:
(\d+\.){3}(\d+)
然后再考虑处理数字大小的问题。
首先,如果百位是2,十位是5,个位只能取0-5
如果百位是2,十位是0-4,个位任意数字
如果百位是0或1,十位和个位可以是任意数字
((25[0-5]|2[0-4]\d|[01]\d\d)\.){3}(25[0-5]|2[0-4]\d|[01]\d\d)
然后考虑百位和十位可能不存在的问题:用?处理这两位。
((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)
最后首尾加一个\b限定字符边界
\b((25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]?\d?\d)\b