这些RegEx之间有什么区别

时间:2013-02-01 14:43:29

标签: regex

  1. (\d+|) vs (\d+)?
  2. [\w\W] vs [\d\D] vs .
  3. 这些常规正则表达式之间有什么区别吗?应该选择哪一个?

    我正在使用Javascript。

3 个答案:

答案 0 :(得分:5)

[\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*)'

答案 1 :(得分:3)

第二个非常有趣,我想谈谈它:

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

    它们通常在没有构造时使用,#34;匹配任何字符,无例外"。 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排除在" normal"模式,但在选择排除更多内容时,它们可能略有不同。

答案 2 :(得分:2)

你没有说你正在使用哪种语言,所以我将假设Perl。

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

  2. [\w\W][\d\D]相同,匹配任何字符。默认情况下,.相当于[^\n](匹配任何字符,但换行符)。如果您确实想要匹配任何字符,则应使用.并指定/s标记,以使.与任何字符匹配。