[解決済み】グローバルフラグを持つRegExpが間違った結果を出すのはなぜですか?
2022-03-27 06:46:02
質問
この正規表現で、globalフラグとcase insensitiveフラグを使用した場合の問題点は何ですか?クエリーはユーザーが作成した入力です。結果は[true, true]であるべきです。
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
解決方法は?
A
RegExp
オブジェクトに
g
フラグは
lastIndex
そのため、それ以降のマッチでは 0 ではなく最後に使われたインデックスから開始されます。
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
alert(re.lastIndex);
result.push(re.test('Foo Bar'));
を手動でリセットしたくない場合は
lastIndex
を 0 にすることで、テストごとに
g
フラグを使用します。
以下は、仕様で決められているアルゴリズムです(15.10.6.2項)。
RegExp.prototype.exec(string)
を実行します。 文字列の正規表現マッチ を正規表現と比較し を含むArrayオブジェクトを返します。 の場合、NULLとなります。 文字列にマッチしなかった場合 ToString(string)が検索されます。 の出現は、正規表現 パターンを以下のように設定します。
- レッツ R はこのRexExpオブジェクトです。
- を S はToString(string)の値である。
- を 長さ の長さである。 S .
- のlastIndexプロパティの値をlastIndexとする。 R .
- ToInteger(lastIndex)の値をiとする。
- グローバルプロパティが false の場合、i = 0 とする。
- i < 0またはi >lengthの場合、以下のように設定します。 lastIndex のプロパティは R を 0 に設定して null を返します。
- 引数Sとiを与えて[[Match]]を呼び出します。 は失敗を返したので、手順9に進む。 そうでなければ、r をその State 結果とする で、ステップ10に進む。
- i = i+1 とする。
- ステップ7に進みます。
- rのendIndexの値をeとする。
- グローバルプロパティがtrueの場合 lastIndex のプロパティは R をeに変換する。
- rのキャプチャ配列の長さをnとする。(これは という値は、15.10.2.1 の NCapturingParens.)
- 以下のプロパティを持つ新しい配列を返す。
- インデックス プロパティに設定されます。 マッチした部分文字列を完全な 文字列S.
- 入力プロパティが設定される をSに変換します。
- 長さプロパティは n + 1.
- 0 プロパティに設定されます。 マッチした部分文字列(すなわち Sのオフセットiを含むと オフセットeを除く)。
- 各 i > 0 かつ i ≤ n であるような整数 i。 ToString(i)という名前のプロパティを rのキャプチャ配列の第i番目の要素。
関連
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】 \u003C とは何ですか?
-
[解決済み] 文字列の完全一致のための正規表現
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] 私のJavaScriptコードは "No 'Access-Control-Allow-Origin' header is present on requested resource "というエラーを受け取りますが、Postmanはそうならないのはなぜですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] なぜ ++[[]][+[] +[+[]] は "10" という文字列を返すのでしょうか?
-
[解決済み] parseInt(1/0, 19)はなぜ18を返すのですか?
-
[解決済み] ユーザー入力文字列を正規表現に変換する
-
[解決済み] Date.parseが不正確な結果を出すのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】NodeJS "ESモジュールをロードするためにインポートを使用する必要があります。"
-
[解決済み】BootstrapのCollapseが折りたたまれない
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み】WebSocket接続に失敗しました。WebSocket のハンドシェイク中にエラーが発生しました。予期しない応答コードです。400
-
[解決済み】TypeError: res.status は関数ではありません。
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み】ETIMEDOUTエラーの対処方法は?
-
[解決済み] Javascriptのregex.exec()はなぜいつも同じ値を返さないのですか?重複
-
[解決済み] Javascriptの正規表現は、true, then false, then true...などを返す [重複].