(\d+|)
vs (\d+)?
[\w\W]
vs [\d\D]
vs .
这些常规正则表达式之间有什么区别吗?应该选择哪一个?
我正在使用Javascript。
答案 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。
(\d+|)
相当于(\d*)
。它匹配0或更多位的序列,并将结果捕获到$1
。 (\d)?
匹配0或1位数。如果它与数字匹配,则将其放入$1
;否则$1
将为undef
(如果您要删除(?:(\d)|)
,则可以将其重写为?
。
[\w\W]
和[\d\D]
相同,匹配任何字符。默认情况下,.
相当于[^\n]
(匹配任何字符,但换行符)。如果您确实想要匹配任何字符,则应使用.
并指定/s
标记,以使.
与任何字符匹配。