以下行在jQuery源代码中:
// Used for matching numbers
core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
我对两个非捕获组中的最后一个垂直条感到困惑,
(?:\d*\.|)
和
(?:[eE][\-+]?\d+|)
正则表达式/(a | b)/匹配a或b,所以我想知道什么/(a | b |)/匹配,它似乎“匹配所有”,换句话说
reg1 = /(a|b)/;
reg1.test('c'); // false
reg2 = /(a|b|)/;
reg2.test('c'); // true
发生了什么事?
答案 0 :(得分:1)
(a|b|)
它意味着a
或b
或"没有",' c'包含"没有"
答案 1 :(得分:1)
[\-+]? # a plus or a minus sign (optional)
(?: # a non-capturing group
\d*\. # 0 or more decimals and a dot [cond-A1]
| # or
# nothing [cond-A2]
)
\d+ # 1 or more decimals [decimal]
(?: # a non-capturing group
[eE][\-+]?\d+ # (e or E) + optional(minus or plus) + 1 or more decimals [cond-B1]
| # or
# nothing [cond-B2]
)
以下是一些例子(我正在跳过第一个可选的加号/减号)。
[cond-A1][decimal][cond-B2]
[cond-A1][decimal][cond-B2]
[cond-A2][decimal][cond-B2]
[cond-A1][decimal][cond-B1]
[cond-A1][decimal][cond-B1]
答案 2 :(得分:1)
我会尝试将其分解成块:
[\-+]?
:这与加号,减号或两者都不匹配。(?:\d*\.|)
:此组(?:
使其成为非捕获组)任意数量的数字后跟一个点或什么都没有。\d+
:匹配一个或多个连续数字。(?:[eE][\-+]?\d+|)
:将小写或大写“e”分组,可能后跟加号或减号,后跟数字后跟所有内容。或者,没什么。 (a|)
首先查找a
。如果a
不存在,则它不匹配。写作(a)?
是一种令人困惑的方式。
这个正则表达式有点令人困惑。我会像这样重写它:
/[+-]?\d*\.?\d+(?:e[+-]?\d+)?/i