有人可以解释[^\d\s]
和[\D\S]
之间的区别吗?
http://www.regular-expressions.info/shorthand.html的说明并不是很清楚:
在方括号内使用否定的短角线时要小心。
[\D\S]
与[^\d\s]
不同。后者匹配任何 既不是数字也不是空白的字符。它匹配x
,但是 不是8
。然而,前者匹配任何不是的角色 一个数字,或不是空格。因为所有数字都不是空格, 并且所有空格字符都不是数字,[\D\S]
匹配任何数字 字符;数字,空格或其他。
对我来说它们似乎是一样的。或者我会错过什么?
答案 0 :(得分:9)
[^\d\s]
将匹配不是数字或空格的单个字符。
[\D\S]
将匹配一个非数字或非空白的单个字符。
由于每个字符都不是数字或不是空格,因此第二个正则表达式将匹配任何字符。
它等同于:
之间的区别if (!(isdigit(c) || isspace(c))) ...
和
if (!isdigit(c) || !isspace(c)) ...
请注意,以下内容相当于第一个(根据deMorgan法律):
if (!isdigit(c) && !isspace(c)) ...
答案 1 :(得分:5)
[abc]
等字符类表示“匹配 a
或 b
的一个字符或者 c
。请注意,这并不意味着“匹配a
AND b
AND { {1}},这没有任何意义。c
表示“匹配一个 [^abc]
a
也不是 b
,换句话说,它不是c
AND 而不是a
AND 而不是b
请注意,数字1全部来自 OR ,而数字2全部来自 AND 。c
表示“匹配一个不是数字的字符 AND 而不是空格”,而[^\d\s]
表示“匹配一个非数字 OR 非空白字符”你可以看到3和4完全不同。
[\D\S]
的含义是什么?
我们可以“匹配一个非数字 OR 非空白字符”。非数字可以是例如制表符。好的,我们可以匹配制表符,[\D\S]
实际上允许我们匹配任何空格,因为空格(如制表符)绝不是数字。现在让我们看一下\D
。非空格可以表示例如\S
个字符,因此9
允许我们匹配任何数字(和更多字符)。因为\S
表示“一个字符[\D\S]
或 \D
”,但并不意味着“一个字符同时为\S
< strong> AND \D
“,我们可以匹配任何数字和任何空格(实际上是任何字符)。
和vs或
关键是,在数字1和数字4中,字符类说“匹配一个 或或的字符。要么就像说 OR 。在3号中,我们说既不是。就像说不是x AND 而不是y