(\d+|)
对比(\d+)?
[\w\W]
对比[\d\D]
对比.
这些常规正则表达式之间有什么区别吗?应该选择哪一个?
我正在使用 Javascript。
[\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*)'
第二个很有趣,我想说几句:
[\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
应该在“正常”模式下排除,但他们在选择排除更多方面可能略有不同。
你没有说你使用的是哪种语言,所以我假设 Perl。
(\d+|)
相当于(\d*)
。它匹配 0 个或多个数字的序列并将结果捕获到$1
. (\d)?
匹配 0 或 1 位数字。如果它匹配一个数字,则将其放入$1
;否则$1
将是undef
(你可以重写它,(?:(\d)|)
好像你想消除?
)。
[\w\W]
并且[\d\D]
是等价的,匹配任何字符。.
默认情况下等效于[^\n]
(匹配除换行符以外的任何字符)。如果你真的想匹配任何字符,你应该使用.
并指定/s
标志,它可以.
匹配任何字符。