【发布时间】:2013-01-16 21:49:57
【问题描述】:
-
(\d+|)与(\d+)? -
[\w\W]vs[\d\D]vs.
这些常规正则表达式之间有什么区别吗?应该选择哪一个?
我正在使用 Javascript。
【问题讨论】:
-
或rubular.com ...并选择最简单易懂的那个。
标签: regex
(\d+|) 与 (\d+)?
[\w\W] vs [\d\D] vs .
这些常规正则表达式之间有什么区别吗?应该选择哪一个?
我正在使用 Javascript。
【问题讨论】:
标签: regex
[\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*)'
【讨论】:
multiline 和 dotall 完全不同。 . 不会匹配仅设置了 multiline 选项的换行符。
(\d+)?。匹配 null,或一个或多个数字。它相当于(\d+|)。你应该简单地使用(\d*)。
第二个很有意思,我想说几句:
[\w\W] 和[\d\D] 等价,它们也等价于[\s\S]。 \W 是 \w 的补码字符集,同样适用于 \D - \d 对和 \S - \s 对。因此,放在一起时,它们将毫无例外地匹配任何字符。
它们通常在没有“匹配任何字符,无例外”的构造时使用。 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应该在“正常”模式下被排除,但他们在选择排除更多时可能略有不同。
【讨论】:
你没有说你使用的是哪种语言,所以我假设是 Perl。
(\d+|) 等价于(\d*)。它匹配 0 个或多个数字的序列并将结果捕获到$1。 (\d)? 匹配 0 或 1 位数字。如果匹配一个数字,则将其放入$1;否则$1 将是undef(如果要消除?,可以将其重写为(?:(\d)|))。
[\w\W] 和 [\d\D] 是等价的,可以匹配任何字符。默认情况下,. 等效于 [^\n](匹配除换行符以外的任何字符)。如果你真的想匹配任何字符,你应该使用.并指定/s标志,这使得.匹配任何字符。
【讨论】: