【问题标题】:What is the difference between the regular expressions [^\d\s] and [\D\S]正则表达式 [^\d\s] 和 [\D\S] 有什么区别
【发布时间】:2014-06-01 04:58:10
【问题描述】:

有人能解释一下[^\d\s] 和[\D\S] 之间的区别吗?

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

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

它们对我来说似乎是一样的。还是我错过了什么?

【问题讨论】:

  • 阅读 Oracle 官方 Java 教程中的 Lesson: Regular Expressions 并在此处找到 Java Regex Pattern 的完整列表以及完整说明。
  • 其中一个答案是否解决了您的问题?我注意到您还没有在 StackOverflow 上投票。如果一个答案解决了您的问题,请考虑通过单击左侧的复选标记“接受它”,因为这就是声誉系统的工作方式(接受答案会给回答者和您带来声誉)。当然,没有义务这样做。稍后,当您获得更多声誉时,您也可以提出问题。感谢收听我的 20 秒 SO rep 教程。 :)

标签: regex


【解决方案1】:
[^\d\s]

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

[\D\S]

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

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

相当于:

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

和

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

请注意,以下将等价于第一个(根据德摩根定律):

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

【讨论】:

  • 感谢您的回答。
【解决方案2】:

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

  1. 诸如[abc]之类的字符类表示“匹配一个或者 a OR b 或 @987654324的字符@. 请注意,这并不意味着“匹配a AND b AND c 的一个字符,这没有任何意义。李>
  2. 诸如[^abc]之类的否定字符类表示“匹配一个既不 a 也不 b 也不 @ 987654331@,换句话说,它不是a AND 不是b AND 不是c。请注意,数字1 是关于OR,而第 2 个数字是关于 AND。
  3. 因此[^\d\s] 的意思是“匹配一个不是数字AND不是空格的字符”,而
  4. [\D\S] 表示“匹配一个非数字或非空白字符”

你可以看到3和4是完全不同的。

[\D\S] 是什么意思?

我们可以“匹配一个非数字 OR 非空白字符”。例如,非数字可以是制表符。好的,所以我们可以匹配制表符,\D 实际上允许我们匹配任何空格,因为空格(例如制表符)永远不是数字。现在让我们看看\S。例如,非空格可以表示9 字符,因此\S 允许我们匹配任何数字(以及更多字符)。因为[\D\S] 表示“一个字符是\D OR \S”,但并不意味着“一个字符同时是\D AND @ 987654346@",我们可以匹配任何数字和任何空格(实际上是任何字符)。

And vs Or

关键是在数字 1 和数字 4 中,字符类都说“匹配一个字符 either 或这些字符。Either 就像说 OR。在数字 3 中,我们说 nother。就像说 not x AND not y

【讨论】:

  • @ooga 谢谢伙计,你的也是。 :)
  • i liked explanation with "C" syntax 太棒了,任何适合你的东西。 :)
  • 我不得不说,我很难理解这一点,但很好地清除了它。如果我是问题的 OP,我会让你的回答被接受。非常感谢你澄清这一点。我相信很多人都会从你的回答中受益。
猜你喜欢
  • 2018-03-24
  • 2016-05-16
  • 2013-10-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多