可以使用 exec() 方法存取 JavaScript 中正規表示式擷取的子群組。此方法傳回一個類似數組的對象,其中包含表達式所做的匹配。
為了說明這一點,請考慮以下範例:
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 陣列的第二個元素。然而,存取 arr[1] 和 arr[0] 分別會導致未定義和不正確的值。
解決未定義的輸出:
缺少值arr[1] 是由於 .*?正規表示式中使用的非貪婪量詞。此量詞捕捉盡可能少的字元數,從而產生不帶分隔符號的字串“format_abc”。
要解決此問題,請使用貪婪量詞.* 代替:
/(?:^|\s)format_(.*)(?:\s|$)/
修正不正確的字串輸出:
出現arr [0] 問題來自使用控制台的類似printf 的格式。 format_%A 中的特殊字元 % 嘗試替換下一個遺失的參數的值。
要解決此問題,請轉義正規表示式中的%:
/(?:^|\s)format_(.*?)(?:\s|$)/
使用透過這些修改,可以實現正確的輸出:
[" 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中文網其他相關文章!