近年來
網(wǎng)站開發(fā)JavaScript得到了長足的發(fā)展,與您可能之前熟悉的內(nèi)容相比,現(xiàn)代JavaScript正則表達式已經(jīng)有了很大的進步。正則表達式可以是搜索和替換文本的神奇工具。
這在JavaScript領域尤其如此,在那里正則表達式被冷落了很多年,與它們在PCRE、Perl等領域的更現(xiàn)代的對應物相比,它們的能力相對不足。NET、Java、Ruby、C++和Python,那些日子已經(jīng)過去了。
ECMAScript 3于1999年標準化,將受Perl啟發(fā)的正則表達式引入了JavaScript語言。盡管它做了足夠多的事情使正則表達式變得非常有用(并且大部分與其他Perl風格兼容),但是仍然有一些大的遺漏。雖然JavaScript等了10年才推出下一個標準化版本ES5,但其他編程語言和正則表達式實現(xiàn)增加了有用的新特性,使它們的正則表達式更強大、可讀性更好。至于你今天能否在你的代碼中安全地使用這些特性,答案是肯定的!這些特性中最新的一個,flagv,在Node.js 20中受支持,并且2023-時代瀏覽器。其余的在2021時代的瀏覽器或更早的版本中受支持。
有了所有這些變化,JavaScript正則表達式現(xiàn)在與其他風格相比如何呢?有多種方法可以考慮這個問題,但這里有幾個關鍵方面:
第一是性能:這是一個重要的方面,但可能不是主要方面,因為成熟的正則表達式實現(xiàn)通常非??臁avaScript在正則表達式性能方面很強(至少考慮到Node.js、基于Chromium的瀏覽器和甚至火狐;和Safari使用的JavaScriptCore),但它使用了一個回溯引擎,該引擎缺少任何用于回溯控制的語法——這是一個使ReDoS漏洞更常見的主要限制。
第二是支持高級功能處理常見或重要的用例:在這里,JavaScript通過ES2018和ES2024加強了它的游戲。JavaScript現(xiàn)在在某些特性方面是同類中最好的,比如lookback(支持無限長度)和Unicode屬性(具有多字符“字符串屬性”、集合減法和交集以及腳本擴展)。這些特性在許多其他版本中要么不受支持,要么不夠健壯。