正则表达式[^ \ d \ s]和[\ D \ S]之间有什么区别

时间:2014-05-31 14:12:35

标签: regex

有人可以解释[^\d\s][\D\S]之间的区别吗?

http://www.regular-expressions.info/shorthand.html的说明并不是很清楚:

  

在方括号内使用否定的短角线时要小心。   [\D\S][^\d\s]不同。后者匹配任何   既不是数字也不是空白的字符。它匹配x,但是   不是8。然而,前者匹配任何不是的角色   一个数字,或不是空格。因为所有数字都不是空格,   并且所有空格字符都不是数字,[\D\S]匹配任何数字   字符;数字,空格或其他。

对我来说它们似乎是一样的。或者我会错过什么?

2 个答案:

答案 0 :(得分:9)

[^\d\s]

将匹配不是数字或空格的单个字符。

[\D\S]

将匹配一个非数字或非空白的单个字符。

由于每个字符都不是数字或不是空格,因此第二个正则表达式将匹配任何字符。

它等同于:

之间的区别
if (!(isdigit(c) || isspace(c))) ...

if (!isdigit(c) || !isspace(c)) ...

请注意,以下内容相当于第一个(根据deMorgan法律):

if (!isdigit(c) && !isspace(c)) ...

答案 1 :(得分:5)

ooga的回答是正确的,但我发现你仍然不清楚。有时用不同的词语听取解释是有用的,所以让我试试。在我看来,误解真的很简单。 Jan Goyvaerts(您阅读的网站的作者)没有描述特定的正则表达式功能,只是字符类逻辑的结果。让我们从头开始

  1. [abc]等字符类表示“匹配 a b 的一个字符或者 c。请注意,这并不意味着“匹配a AND b AND { {1}},这没有任何意义。
  2. 否定字符类(例如c表示“匹配一个 [^abc] a 也不是 b,换句话说,它不是c AND 而不是a AND 而不是b请注意,数字1全部来自 OR ,而数字2全部来自 AND
  3. 因此c表示“匹配一个不是数字的字符 AND 而不是空格”,而
  4. [^\d\s]表示“匹配一个非数字 OR 非空白字符”
  5. 你可以看到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