2013-02-01 170 views
1
  1. (\d+|)之间VS (\d+)?
  2. [\w\W] VS [\d\D] VS .

也是有差别的,这些规则的正则表达式有什么区别?应该选择哪一个?什么是正则表达式这些

我正在使用Javascript。

+0

选择什么? –

+3

请参阅http://regex101.com/ – maerics

+1

或http://rubular.com/ ...并选择最简单,最容易理解的。 –

回答

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*)' 
+0

'multiline'和'dotall'完全不同。 '.'不会与只有'multiline'选项设置的换行符匹配。 –

+0

应该只是说dotall。我的错误 –

+0

我犯了一个错误,在第一行中错过了一个“+”。 – user1990553

3

第二个是挺有意思的,我想谈谈它的东西:

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

    它们通常用于没有构造“匹配任何字符,毫无例外”的情况。 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,但在选择排除更多时可能略有不同。

2

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

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

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