3 回答

TA貢獻1818條經驗 獲得超7個贊
ECMAScript 2018將命名捕獲組引入JavaScript正則表達式。
如果您需要支持舊瀏覽器,您可以使用正常(編號)捕獲組執行所有操作,您可以使用命名捕獲組執行操作,您只需要跟蹤數字 - 如果您的捕獲組的順序可能很麻煩正則表達式的變化。
我能想到的命名捕獲組只有兩個“結構”優勢:
在一些正則表達式中(.NET和JGSoft,據我所知),您可以在正則表達式中為不同的組使用相同的名稱(有關這一事項的示例,請參閱此處)。但是大多數正則表達式都不支持這種功能。
如果您需要在數字包圍的情況下引用編號的捕獲組,則可能會出現問題。假設您想要為數字添加零,因此要替換
(\d)
為$10
。在JavaScript中,這將起作用(只要你的正則表達式中有少于10個捕獲組),但Perl會認為你正在尋找反向引號10
而不是數字1
,然后是a0
。在Perl中,您可以${1}0
在這種情況下使用。
除此之外,命名捕獲組只是“語法糖”。僅在您真正需要時才使用捕獲組,并(?:...)
在所有其他情況下使用非捕獲組。
使用JavaScript的更大問題(在我看來)是它不支持詳細的正則表達式,這將使可讀,復雜的正則表達式的創建更容易。
Steve Levithan的XRegExp庫解決了這些問題。

TA貢獻1876條經驗 獲得超5個贊
另一種可能的解決方案:創建一個包含組名和索引的對象。
var regex = new RegExp("(.*) (.*)");var regexGroups = { FirstName: 1, LastName: 2 };
然后,使用對象鍵來引用組:
var m = regex.exec("John Smith");var f = m[regexGroups.FirstName];
這使用正則表達式的結果提高了代碼的可讀性/質量,但不提高了正則表達式本身的可讀性。
添加回答
舉報