反义:匹配不属于指定集合里的字符,两类写法:大写预定义元字符、
[^...]负字符集
一、预定义反义简写
| 小写(匹配) | 大写(反义,不匹配) | 说明 |
|---|---|---|
\w | \W | \w:字母、数字、下划线、汉字;\W:除此之外任意字符 |
\s | \S | \s:空白(空格、tab、换行);\S:非空白字符 |
\d | \D | \d:数字;\D:非数字字符 |
\b | \B | \b:单词边界;\B:不是单词边界的位置(位置匹配,不是字符) |
\B是位置,不消费字符,和前面几个不一样,不是用来匹配字符的。
二、[^...] 负字符集
语法:[^字符列表]
^必须写在中括号的最开头,才代表取反;放到括号里面其他位置,就是普通的^字符。
例子:
[^x]:匹配任意不是 x 的单个字符[^aeiou]:匹配任意不是 a/e/i/o/u 的单个字符(非元音字母)[^0-9]:等价\D,非数字
例子:提取a标签开头 <a ...>,不要后面的文本
<a [^>]+>
Code language: HTML, XML (xml)
拆解:
<a:固定开头[^>]+:一个或多个,不是 > 的字符>:结束尖括号
含义:匹配 <a 开始,一直读到第一个 > 为止,刚好拿到 a 标签的起始标签,不会跨到标签外面。
不用贪婪模式也可以实现。对比贪婪写法:
<a .+>,会一直匹配到整个文档最后一个 >(贪婪)。
[^>]+天然不会越过>,效果等价非贪婪,但原理不同:直接禁止匹配 >。
注意
[a^b]:这里^不在最前面,只是普通字符 ^,不是取反!匹配 a 或 ^ 或 b[^]:不同引擎含义不一样,不要随便写[^aeiou]只匹配单个字符,不是“匹配一串不是元音的文本”;要一串就加量词[^aeiou]+
Previous: 正则-分组
Next: 后向引用(反向引用)