3

私がやろうとしているのは、一致するパターンを抽出することですが、パターンの 1 つがオプションである可能性があります。直接例に行きましょう。

私が一致させようとしているターゲットテキストは、

<foo>\n<bar>\n#####<foo>\n#####<bar>

そして、私の正規表現は、

/(#{5})?/

(ここで ? を使用する理由は、特定のパターンがオプションである可能性があるためです。たとえば、このパターンの「未定義」ではなく、一致が完全にミスになることは望ましくありません。 )

str.match() によって返されると私が期待したのは、

[ '#####',
  '#####',
  index: 12,
  input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]

しかし、実際には、

[ '',
  undefined,
  index: 0,
  input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]

代わりに次のパターンを使用すると、正常に動作します。

/(#{5})+/

なんで?

nodejs/chrome と IE の両方でこれを試しましたが、どちらも機能しません。これは、この動作が JS エンジン全体で一貫していることを意味します。しかし、私が試した多くのツールの 1 つであるregexpalと同じようには動作しません。それがツール自体の問題なのか、実装が異なるだけなのかはわかりません。

4

1 に答える 1

0
var re = /(#{5})/;
console.log ("<foo>\n<bar>\n#####<foo>\n#####<bar>".match (re));
console.log ("<foo>\n<bar>\nfoo>\n<bar>".match (re));

出力:

[ '#####',
  '#####',
  index: 12,
  input: '<foo>\n<bar>\n#####<foo>\n#####<bar>' ]
null

オプションの場合、正規表現は一致しない場合に失敗し、失敗した場合は null を返します。

> /a/.exec("a")
[ 'a', index: 0, input: 'a' ]
> /a/.exec("b")
null
> "a".match(/a/)
[ 'a', index: 0, input: 'a' ]
> "b".match(/a/)
null

また、String#match() を使用しないでください。RegExp#exec() よりも遅く、どちらも同じ結果を返します。

match() と exec()

于 2012-11-12T09:11:27.140 に答える