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

use*_*243 3 regex

有人可以解释之间的差异[^\d\s][\D\S]

来自http://www.regular-expressions.info/shorthand.html的描述并不是很清楚:

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

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

oog*_*oga 9

[^\d\s]
Run Code Online (Sandbox Code Playgroud)

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

[\D\S]
Run Code Online (Sandbox Code Playgroud)

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

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

它相当于以下区别:

if (!(isdigit(c) || isspace(c))) ...
Run Code Online (Sandbox Code Playgroud)

if (!isdigit(c) || !isspace(c)) ...
Run Code Online (Sandbox Code Playgroud)

请注意,以下内容相当于第一个(通过deMorgan定律):

if (!isdigit(c) && !isspace(c)) ...
Run Code Online (Sandbox Code Playgroud)


zx8*_*x81 5

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

  1. 字符类,如[abc]表示"匹配一个字符是要么 a OR b c需要注意的是,这并不意味着"匹配一个字符是a b AND c,这将没有任何意义.
  2. 一个否定的字符类,例如[^abc]意味着"匹配一个既不 a b 也不也不c,也就是说,它不是a 不是b 不是c.请注意,数字1都是关于OR的,而数字2都是关于AND的.
  3. 因此,[^\d\s]意思是"匹配一个字符不是一个数字不是空白",而
  4. [\D\S]表示"匹配一个字符或者是一个非数字的OR非空白"

你可以看到3和4完全不同.

什么[\D\S]意思?

我们被允许"匹配一个字符要么是一个非数字一个非空白".非数字可以是例如制表符.好的,所以我们可以匹配制表符,\D实际上它允许我们匹配任何空格,因为空格(如制表符)绝不是数字.现在让我们来看看\S.非空格可以表示例如9字符,因此\S允许我们匹配任何数字(和更多字符).因为[\D\S]"一个字符是\D OR \S ",但并不意味着"一个字符既是\D AND \S ",我们可以匹配任何数字和任何空格(实际上是任何字符).

和VS或

最关键的是,在这两个1号和4号,角色职业说"匹配一个字符,要么或这些字符.无论是喜欢说在3号,我们说没有.这好像是说不是X 不ÿ