【问题标题】:What's the difference between these RegEx这些 RegEx 有什么区别
【发布时间】:2013-01-16 21:49:57
【问题描述】:
  1. (\d+|) 与 (\d+)?
  2. [\w\W] vs [\d\D] vs .

这些常规正则表达式之间有什么区别吗?应该选择哪一个?

我正在使用 Javascript。

【问题讨论】:

标签: regex


【解决方案1】:

[\w\W] 和 [\d\D] 用于 JavaScript 等没有 dotall 选项的语言。 它匹配所有字符,包括换行符,不像 . 匹配所有字符但换行符。

   \w\W or \d\D   -> matches everything including newline characters
              .   -> matches everything except newline characters unless 
                     's' (dotall modifier) is specified 
(\d+|) or (\d+)?  -> matches 1 or more digits OR any position (null)
                     It could simply be written as '(\d*)'

【讨论】:

  • multiline 和 dotall 完全不同。 . 不会匹配仅设置了 multiline 选项的换行符。
  • 应该只说dotall。我的错误
  • 我错漏了第一行的“+”。
  • @user1990553 (\d+)?。匹配 null,或一个或多个数字。它相当于(\d+|)。你应该简单地使用(\d*)。
【解决方案2】:

第二个很有意思,我想说几句:

  • [\w\W] 和[\d\D] 等价,它们也等价于[\s\S]。 \W 是 \w 的补码字符集,同样适用于 \D - \d 对和 \S - \s 对。因此,放在一起时,它们将毫无例外地匹配任何字符。

    它们通常在没有“匹配任何字符,无例外”的构造时使用。 JavaScript 就是这种情况的一个例子。在 JavaScript [^] 中还有一个鲜为人知且高度混乱的构造,这在其他风格中通常是无效的。

  • 点. 通常匹配任何字符,但换行\n。根据语言,它可能会排除更多字符。

    对于Java,不包括\n、\r、\u0085、\u2028 和\u2029。所以. 等价于[^\n\r\u0085\u2028\u2029]

    对于JavaScript,点. 将排除\r、\u2028 和\u2029 以及\n。所以. 等价于[^\n\r\u2028\u2029]

    某些语言会有一种模式让. 匹配任何字符,无一例外。在 Java 和 Python 中称为 DOTALL 模式,在 C# 和 Perl 中称为 SingleLine 模式。

. 的行为因语言而异。一般来说,他们都同意\n应该在“正常”模式下被排除,但他们在选择排除更多时可能略有不同。

【讨论】:

    【解决方案3】:

    你没有说你使用的是哪种语言,所以我假设是 Perl。

    1. (\d+|) 等价于(\d*)。它匹配 0 个或多个数字的序列并将结果捕获到$1。 (\d)? 匹配 0 或 1 位数字。如果匹配一个数字,则将其放入$1;否则$1 将是undef(如果要消除?,可以将其重写为(?:(\d)|))。

    2. [\w\W] 和 [\d\D] 是等价的,可以匹配任何字符。默认情况下,. 等效于 [^\n](匹配除换行符以外的任何字符)。如果你真的想匹配任何字符,你应该使用.并指定/s标志,这使得.匹配任何字符。

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2012-09-27
      • 2011-11-22
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多