2

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

到底是怎么回事?

4

3 回答 3

1

(a|b|)它是意思ab“无”,“c”包含“无”

于 2013-01-13T00:47:27.523 回答
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]
于 2013-01-13T00:54:08.577 回答
1

我将尝试将其分解为块:

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

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

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

/[+-]?\d*\.?\d+(?:e[+-]?\d+)?/i
于 2013-01-13T01:02:21.947 回答