1
  1. (\d+|)对比(\d+)?
  2. [\w\W]对比[\d\D]对比.

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

我正在使用 Javascript。

4

3 回答 3

5

[\w\W]并且[\d\D]在没有 dotall 选项的 JavaScript 等语言中使用。它匹配所有字符,包括换行符,.这与匹配换行符之外的所有字符不同。

   \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*)'
于 2013-02-01T14:46:47.577 回答
4

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

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

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

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

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

    对于JavaScript,点将.排除\r,\u2028\u2029除了\n. 所以.相当于[^\n\r\u2028\u2029]

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

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

于 2013-02-01T14:48:02.173 回答
2

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

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

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

于 2013-02-01T14:48:59.947 回答