(\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标志,它可以.匹配任何字符。