[^\d\s] 和 [\D\S] 是一回事吗?
答案是:完全不是! 它们的匹配结果天差地别。这实际上是一个逻辑学上的问题(涉及到离散数学中的德摩根定律)
1. [^\d\s]:严格的筛选器(既不是...也不是...)
- 逻辑:开头的脱字符
^对中括号内的所有内容进行了整体取反。 - 含义:匹配一个字符,这个字符必须既不是数字(
\d),也不是空白符(\s)。也就是说,它同时排除了这两类字符。 - 匹配结果:它只能匹配字母、标点符号、特殊符号等。
- 字母
A-> 匹配(既非数字也非空格) - 符号
@-> 匹配 - 数字
5-> 不匹配(被排除了) - 空格 > 不匹配(被排除了)
2. [\D\S]:匹配一切的“黑洞”(要么是...要么是...)
- 逻辑:这是一个普通的字符集,表示里面的元素是**“或”**的关系。
- 含义:匹配一个字符,这个字符要么是“非数字”(
\D),要么是“非空白符”(\S)。 - 烧脑的地方来了:仔细想一想,世界上的任何一个字符,是不是总能满足这两个条件中的至少一个?
- 数字
5:它不是非数字(不满足\D),但它是非空白符(满足\S) -> 匹配! - 空格 :它不是非空白符(不满足
\S),但它是非数字(满足\D) -> 匹配! - 字母
A:既是非数字,也是非空白符 -> 匹配!
- 匹配结果:由于没有任何一个字符能同时做到“既是数字又是空格”,所以
[\D\S]实际上等同于匹配任意单个字符。
💡 总结
[^\d\s]= NOT (数字 OR 空格) = 非数字 AND 非空格[\D\S]= 非数字 OR 非空格
这就好比你去相亲:
[^\d\s]说:“我不要抽烟的,也不要喝酒的。”(要求很严格,排除了很多人)[\D\S]说:“我要么找个不抽烟的,要么找个不喝酒的。”(要求极低,因为就算遇到个抽烟的,只要他不喝酒也行,基本所有人都能满足)