JS 正規マッチングの落とし穴の記録

JS 正規マッチングの落とし穴の記録

最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か超常現象が起こっているのではないかと疑うほどでした。

以下はピットコードです

   var str=["二七1","二七2","金水","二七3","二七4","二七5"]
        var reg = new RegExp ("二七", "g");
        for(var i=0;i<str.length;i++){
            if(reg.test(str[i])){
                コンソールログ(str[i])
            }
        }

正規表現を使用してstrをグロ​​ーバルに一致させ、条件に合致したときにそれを出力します。

明らかな理由なく 2 つが欠落しており、それらについては別途判断します。

      var str=["二七1","二七2","金水","二七3","二七4","二七5"]
        var reg = new RegExp ("二七", "g");
        for(var i=0;i<str.length;i++){
            if(reg.test(str[i])){
                コンソールログ(str[i])
            }
            もし(i==1){
                コンソールログ(reg.test(str[i]))
            }
            もし(i==4){
                コンソールログ(reg.test(str[i]))
            }
        }

それで私はこれを手に入れました

もう 1 つが欠けていますが、欠けている 2 つは規則性チェックを満たしていることがわかります。その後、インターネットで次の文章を見つけました。

文字列が正規表現で正常に一致した場合、lastIndex は、文字列グローバル一致の次の検索の開始点として、最初に一致した文字列の位置に設定されます。後続のフィールドが正常に一致した場合、一致が失敗するまで lastIndex が繰り返し再割り当てされ、0 にリセットされます。

しかし、先生に聞いたところ、一致が見つかった後はlastIndex+1が返されると教えてくれました。つまり、最初に一致したとき、lastIndexは2でした。この2は文字列の添え字であり、配列の添え字ではありません。したがって、str[1]を判断するときは、0からではなく、文字列の添え字2から始まります。したがって、2番目の判断は偽であり、一致は失敗します。LastIndexは0に設定されているため、3番目の一致は成功できます。

したがって、判定結果が true になると、lastIndex は 0 に設定され、データは正常になります。

データは正常です。

要約する

グローバル マッチングを使用する場合、各検索後に lastIndex が 0 に設定されるか、グローバル マッチングは使用されず、直接マッチングが実行されます。

ネットユーザーのまとめは以下のとおりです。

lastIndex は文字通り最後のインデックスを意味します。実際には、正規表現が次の検索を開始するインデックス位置を意味します。最初は常に 0 です。最初の検索が完了すると、lastIndex の値は、一致した文字列の最後の文字のインデックス位置に 1 を加えた値に設定されます。2 番目の検索は lastIndex 位置から開始され、以下同様に続きます。見つからない場合、lastIndex は 0 にリセットされます。 lastIndex 属性は、グローバル フラグ付きの正規表現でのみ機能することに注意してください。上記のコードの正規表現から g フラグを削除すると、3 つのポップアップはすべて true になります。

困っている友人は参考にしてください。JS 正規マッチングの落とし穴の記録に関するこの記事はこれで終わりです。より関連性の高い JS 正規マッチングの落とし穴については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援してください。

以下もご興味があるかもしれません:
  • js 正規表現学習ノート: 文字列のマッチング
  • 通常のマッチングパスワードは数字と文字の組み合わせのみになります [PHP および JS 実装]
  • 文字列 文字列マッチング JavaScript 正規表現
  • JS 定期学習ノート: 文字列リテラルのマッチング
  • 文字列リテラルに一致する JavaScript 正規表現
  • JS定期学習ノート: 文字列リテラルのマッチングの最適化

<<:  2 級コンピュータ試験のための MySQL の知識ポイントとよく使用される MYSQL コマンド

>>:  tomcatでcatalina.outログをカットする3つの方法の詳細な説明

推薦する

Linux で Docker を使用して MySQL をインストールする手順

テスターとして、学習プロセス中に Linux でソフトウェアをインストールする必要が頻繁にある場合が...

シンプルなナビゲーションバー機能を実現するHTML+CSS

さっそく、コードを見てみましょう(初心者:特に言うことはありません) <!DOCTYPE ht...

MySQL 権限昇格のさまざまな形態の概要

目次1. Webshel​​lを書く出力ファイルにシェルを書き込むログファイル書き込みシェル2. U...

Linuxでpyファイルを直接実行する方法

1. まずファイルを作成します(ファイルを配置するディレクトリにcdします) myTest.py を...

Linuxサービスの監視と運用および保守

目次1. psutilパッケージをインストールする次に、オペレーティングシステム内のすべてのサービス...

MySQL 8.0.22 圧縮パッケージの完全なインストールと構成のチュートリアル図 (テスト済みで効果的)

1. zipインストールパッケージをダウンロードするMySQL サーバー 8.0.22 の圧縮パッ...

docker-compose が遅すぎる場合の解決策の詳細な説明

解決策はただ一つ、ソースを変更することです。 github からのソースは基本的にタイムアウトするの...

入力[type=file]の起動が遅くて動かなくなる問題を素早く解決します

入力タグタイプがファイルで、タグ内にaccpet="image/*"属性が設定さ...

Vue 親子コンポーネントの相互値の転送と呼び出し

目次1. 親が子コンポーネントに値を渡す2. 子コンポーネントが親コンポーネントに値を渡す3. 子コ...

Linux viコマンドの知識ポイントと使い方のまとめ

Linux viコマンドの詳しい説明vi エディタは、すべての Unix および Linux システ...

Alibaba Cloud ECS centos6.8 に MySql5.7 をインストールして設定するチュートリアル

Alibaba Cloud yum コマンドでのデフォルトの MySQL バージョンは 5.17**...

システム エラー 1067 のため、MySQL 5.6 解凍バージョン サービスを開始できません

今日午後ずっと私を悩ませたバグを記録する半月前から始めましょう。それから.................

MySQL マルチバージョン同時実行制御 MVCC の詳細な研究

MVCC MVCC (Multi-Version Concurrency Control) は、マル...

HTML フォーム送信アクションと URL ジャンプアクションの違い

フォームのアクションは URL ジャンプとは異なります。フォームはバックグラウンドにデータを渡すこと...

フロントエンドコンポーネント化の基礎知識を詳しく解説

目次コンポーネントの基本概念オブジェクトとコンポーネントの違い成分属性属性とプロパティ属性:財産:ク...