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つの方法の詳細な説明

推薦する

docker compose を使用して fastDFS ファイル サーバーを構築する方法

前回の記事では、docker compose を使用して FastDfs ファイル サーバーをインス...

JavaScript における async と await の使い方とメソッド

JS の async 関数と await キーワード 関数ヘルワールド() { 「こんにちは!美しい...

Linux システムで grub.cfg ファイルの破損を修復する手順

目次1. grub.cfg ファイルの紹介1. grub.cfg ファイルの場所2. grub.cf...

MySQL でストリーミングクエリを使用してデータ OOM を回避する

目次1. はじめに2. JDBCはストリーミングクエリを実装する3. パフォーマンステスト3.1. ...

WeChatアプレットでvantフレームワークを使用するための具体的な手順

目次1. アプレットのプロジェクト ディレクトリを開き、ファイルの場所を開きます。 2. プロジェク...

JavaがMySQL 8.0に接続できない問題の解決策

この記事では、参考までにMySQL 8.0に接続できないJavaの問題をまとめて紹介します。具体的な...

Dockerコンテナとホストマシン間の8時間の差の問題を解決する

デプロイに docker-compose を使用すると、出力ログと関連イベントが検証されて出力される...

モバイル端末の適応に関する簡単な説明

序文フロントエンド コードの記述では、「互換性」という言葉から逃れることはできません。過去の PC ...

Mysql5.7.14 Linux版のパスワードを忘れた場合の完璧な解決策

/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...

MySQL データ型 DECIMAL の使用方法の詳細な説明

MySQL DECIMALデータ型は、データベースに正確な数値を保存するために使用されます。会計シス...

JavaScript と JQuery フレームワークの基本チュートリアル

目次1. JS オブジェクトDOM –1、機能–2、テスト3. jQuery –1. 概要–2、使用...

MySQLデータベースイベントスケジュール実行タスクの詳細な説明

1. 背景プロジェクトの業務が進むにつれて、データベース テーブルの数がどんどん大きくなり、ハードデ...

CSS 背景画像を設定するための 6 つの興味深いヒント

background-image は、おそらくすべてのフロントエンド開発者がキャリアの中で少なくとも...