澄清jQuery源中的正则表达式

时间:2013-01-13 00:44:06

标签: javascript jquery regex

以下行在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

发生了什么事?

3 个答案:

答案 0 :(得分:1)

(a|b|)它意味着ab或"没有",' 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]
)

以下是一些例子(我正在跳过第一个可选的加号/减号)。

  • .3 将为[cond-A1][decimal][cond-B2]
  • 1.3 也是[cond-A1][decimal][cond-B2]
  • 3 将为[cond-A2][decimal][cond-B2]
  • 9.0122222900391E-5 将为[cond-A1][decimal][cond-B1]
  • 6.0221418E23-5 也是[cond-A1][decimal][cond-B1]

答案 2 :(得分:1)

我会尝试将其分解成块:

  • [\-+]?:这与加号,减号或两者都不匹配。
  • (?:\d*\.|):此组(?:使其成为非捕获组)任意数量的数字后跟一个点什么都没有。
  • \d+:匹配一个或多个连续数字。
  • (?:[eE][\-+]?\d+|):将小写或大写“e”分组,可能后跟加号或减号,后跟数字后跟所有内容。或者,没什么。

(a|)首先查找a。如果a不存在,则它不匹配。写作(a)?是一种令人困惑的方式。

这个正则表达式有点令人困惑。我会像这样重写它:

/[+-]?\d*\.?\d+(?:e[+-]?\d+)?/i