ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript 正規表現で一致したグループに正しくアクセスするにはどうすればよいですか?
JavaScript の正規表現でキャプチャされたサブグループにアクセスするには、exec() メソッドを使用します。このメソッドは、式によって一致したものを含む配列のようなオブジェクトを返します。
説明のために、次の例を考えてみましょう。
var myString = "something format_abc"; // Obtain "abc" const arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString); console.log(arr); // Outputs: [" format_abc", "abc"] console.log(arr[1]); // Outputs: undefined (the issue) console.log(arr[0]); // Outputs: format_undefined (another issue)
期待される出力は、サブグループ "abc" を取得することです。 arr 配列の 2 番目の要素として。ただし、arr[1] と arr[0] にアクセスすると、それぞれ未定義の値と不正な値が返されます。
未定義の出力の解決:
arr[1] は .*? が原因です。正規表現で使用される非貪欲量指定子。この量指定子は可能な最小数の文字をキャプチャし、区切り文字のない文字列 "format_abc" になります。
これを修正するには、代わりに貪欲な量指定子 .* を使用します。
/(?:^|\s)format_(.*)(?:\s|$)/
間違った文字列出力の修正:
arr[0]この問題は、コンソールの printf に似た書式設定の使用によって発生します。 format_%A の特殊文字 % は、欠落している次のパラメータの値を置換しようとしました。
これを修正するには、正規表現内の % をエスケープします。
/(?:^|\s)format_(.*?)(?:\s|$)/
Withこれらの変更により、正しい出力が得られます:
[" format_abc", "abc"] console.log(arr[1]); // Outputs: "abc" console.log(arr[0]); // Outputs: " format_abc"
matchAll() による一致したグループへのアクセス(ECMAScript 2020 以降):
String.prototype.matchAll() メソッドは、文字列内の複数の一致を反復処理する最新のより直感的なアプローチを提供します。次のように使用できる反復子を返します:
const string = "something format_abc"; const regexp = /(?:^|\s)format_(.*?)(?:\s|$)/g; const matches = string.matchAll(regexp); for (const match of matches) { console.log(match); console.log(match.index); }
以上がJavaScript 正規表現で一致したグループに正しくアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。