2

次の行は、jQuery ソース コードにあります。

// Used for matching numbers
core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,

キャプチャしていない 2 つのグループの最後の縦棒に混乱しています。

(?:\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

これをチャンクに分解しようとします:

  • [\-+]?: プラス記号、マイナス記号、またはどちらにも一致しません。
  • (?:\d*\.|): これは、任意の数の数字の後にドットが続くか、または何もグループ化されません (?:非キャプチャ グループになります) 。
  • \d+: 1 つ以上の連続する数字に一致します。
  • (?:[eE][\-+]?\d+|): これは、小文字または大文字の「e」をグループ化し、その後にプラスまたはマイナスが続き、その後に数字が続く可能性があります。または何もありません。

(a|)最初に探しますaa存在しない場合は、何にも一致しません。紛らわしい書き方(a)?です。

この正規表現は少し紛らわしいです。私なら次のように書き直します。

/[+-]?\d*\.?\d+(?:e[+-]?\d+)?/i
于 2013-01-13T01:02:21.947 に答える
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

(a|b|)それは意味aまたはb「何もない」、「c」には「何もない」が含まれています

于 2013-01-13T00:47:27.523 に答える