2

私はregexjavascriptで学ぼうとしています。テストをしている間、私の心は出力を見ることに混乱します。

*でではなくパターンで使用しているときに、出力結果配列に空の文字列が含まれる理由を説明してください+

PS:取得した入力は、学習するための単なるサンプルの単純な文字列です。

これが私のサンプルコードです:

a='bb bbbb bbb'
a.match(/(bb)*/g) // O/P is  ["bb","","bbbb","","bb","",""]
a.match(/(bb)+/g) // O/P is ["bb","bbbb","bb"] 
4

2 に答える 2

3

正規表現の*、またはクリーネ閉包は「ゼロ以上」を意味するため、空の文字列と一致します。

+代わりに「1つ以上」を意味するため、空の文字列とは一致しません。


私たちが次のように持っているとすると

a = 'bb bbbb bbb';

このように表現しましょう:

a = /^bb bbbb bbb$/;

ここで、^は文字列の始まりであり、は文字列$の終わりです。

私たちのパターンは(bb)*です。これは、エンジンが2つのb「0回以上」のシーケンスを検索することを意味します。これはbb、シーケンスが見つかった場合はパターンが一致し、そうでない場合は空の文字列が一致することを意味します。

ここで、ステップバイステップで、ドット(.)を使用して正規表現分析を表します。

手順

        STRING              MATCH ARRAY
start - /^.bb bbbb bbb$/ -> [ ]
    1 - /^bb. bbbb bbb$/ -> [ "bb" ]
    2 - /^bb .bbbb bbb$/ -> [ "bb", "" ]
    3 - /^bb bbbb. bbb$/ -> [ "bb", "", "bbbb" ]
    4 - /^bb bbbb .bbb$/ -> [ "bb", "", "bbbb", "", ]
    5 - /^bb bbbb bb.b$/ -> [ "bb", "", "bbbb", "", "bb" ]
    6 - /^bb bbbb bbb.$/ -> [ "bb", "", "bbbb", "", "bb", "", ]
    7 - /^bb bbbb bbb$./ -> [ "bb", "", "bbbb", "", "bb", "", "" ]

パターンが1つのシーケンスに一致したため、STEP 1プッシュしました。bb

パターンが空の文字列と一致したため、STEP 2プッシュしました。""

パターンが2つのシーケンスに一致したため、STEP 3プッシュしました。bbbb

STEP 4->STEP 2

STEP 5->STEP 1

それ以来、パターンが空の文字列と一致したため、STEP 6プッシュしました。1つだけが見つかりました。""b

最後に$トークンに遭遇し、それは再び空の文字列と一致します。

文字列が"bb bbbb bbbb"配列だった場合は["bb", "", "bbbb", "", "bbbb", ""]

于 2013-02-03T15:55:27.207 に答える
2

*「前のグループに0回以上一致する」という意味です。エンジンは、文字列の最初の直後の位置で一致しようとしbbます。スペースが見つかります。これは、(bb)「ゼロ回」一致したことを意味し、空の一致になります。

+「前のグループに少なくとも1回一致する」ことを意味するため、すべての一致にはbb、ケースの文字シーケンスを含める必要があります。


最後に2つの空の一致がある理由の説明:

最後の「単語」はbbbです。エンジンは一致bbしますが、ここでは問題ありません。次に、1つb残っています。(bb)「ゼロ回」に一致します。次に、文字列の最後の文字と文字列の終わりの間にある文字列の最後の位置で一致を試みます。再び(bb)「ゼロ回」に一致します。

正規表現エンジンがどのように機能するかを詳しく知りたい場合は、「正規表現の習得」という本をお勧めします。

于 2013-02-03T15:58:33.120 に答える