這篇文章主要介紹了JavaScript的正則也有單行模式了,需要的朋友可以參考下
正則表達式最早是由Ken Thompson 於1970 年在他改進過的QED 編輯器裡實現的,正規裡最簡單的元字元「.」 在當時所匹配的就是除換行符外的任意字元:
"." is a regular expression which matches any character except
上面這句話出自QED 在1970 年的官方文檔,這可能是史上第一份正規文檔。
為什麼要這麼規定?是因為 QED 是以行為單位來編輯文件的,而且行尾的換行符號也算在這一行的內容裡。例如你想把一段程式碼中所有的單行註解刪掉,在QED 裡可以用下面這句指令:
1,$s#//.*##
如果「.」 能配對到換行符,那麼換行符也會被刪除,會導致這些行和它的下一行合併,這通常都不是我們想要的結果,所以,“.” 在最初發明時被設計成了不能匹配換行符。雖然現在的作業系統上已經沒有 QED 指令讓我們測試了,但我們還有 VIM,VIM 裡的 “.” 也一樣不能匹配換行符,因為同樣的原因。
不像在Node 中,讀取文件通常是一股腦讀完整個文件,Perl 繼承了眾多Linux 命令按行讀取文件的傳統,像這樣:
while () {print $_}
_ 的末尾也有換行符,所以Perl 也就很自然的繼承了QED 的「.」 不符合換行符的規定。但Perl 畢竟是門程式語言,而不是編輯器,它的正則要匹配的對像不單單會是單行文本,還可能是多行文本,因此在它的正則中,“.” 有跨行匹配的需求,因此Perl 發明了正規的單行模式/s,即讓“.” 也能匹配換行符。
Perl 中用來開啟單行模式的/s 修飾符的官方描述是“Treat the string as single line”,這個“single line” 要這麼理解:“.” 在普通模式下只能匹配行內字符,不能跨行;而在單行模式下,Perl 會假裝把多行字符串看成一行,把其中的換行符看做是行內字符,所以“.” 也就能匹配它們了。更圖像點說,就是把下面的三行文本
1 2 3
看成 "1\n2\n3\n" 一行文本,單行模式就是這個意思。
但要命的是,因為同樣的原因(字串變數可以包含多行文字),Perl 也發明了/m 修飾符,即多行模式,官方描述是「Treat the string as multiple lines ”,這個模式JavaScript 的正則裡自古也有,這裡這個“多行”的意思是說:^ 和$ 元字符默認不會匹配一個字符串中間的那些換行符前後的位置,即認為字符串永遠只有一行,開啟多行模式後就能配對了。
也就是說,單行模式和多行模式是針對不同的元字符的,剛接觸正則的人都會被“單行模式”和“多行模式”這兩個看似是相對應的概念,實則毫無關聯的名詞給搞暈。
後來,Ruby 的作者可能覺得“單行模式”這個正則術語起的不好,特例獨行把讓“.” 匹配換行符這一模式稱之為“多行模式”,即讓. * 之類的正則能夠匹配多行了,所以也完全講得通,修飾符也用了/m(Ruby 中默認會開啟Perl 中的“多行模式”,所以/m 沒被佔用),這真是雪上加霜,更亂了。
再後來,Python 作者可能也覺得應該避免“單行模式”這個叫法,於是起了個新的名字“dotall”,也就是讓dot 能匹配所有字符的意思,很好的名字,再後來Java 也使用了這個名字。
上面回顧了一下歷史,解釋了下單行模式的由來以及說明了下單行模式這個名字起得不好。 V8 最近剛實作了一個stage 3 的ES 提案github.com/mathiasbynens/es-regexp-dotall-flag,這個提案為JavaScript 的正則引入了/s 修飾符和dotAll 屬性,dotAll 屬性是學了Python 和Java, /s 修飾符是繼承了Perl 的,這裡也沒必要發明一個新的修飾符例如/d,只會讓事情變得更複雜。 /s 在JavaScript 的具體效果是讓「.」 能符合先前無法配對的四個行終止符:\n(換行)、\r(回車)、\u2028(行分隔符號)、\u2029(段落分隔符):
/foo/s.dotAll // true /^.{4}$/s.test("\n\r\u2028\u2029") // true
其實就是個很簡單的東西,但可能一些沒有接觸過JavaScript 以外的正規的同學到時候學到這個新的模式後會產生困惑,這裡再澄清一下:多行模式控制的是^ 和$ 的表現,單行模式控制的是「.」的表現,兩者沒有直接關係。
然而當初引入單行模式和多行模式這兩個易混淆概念的Perl 語言,已經在Perl 6 中完全刪除了這兩個模式:“.” 號預設就匹配換行符,\N可以匹配換行符除外的任意字元;^ 和$ 始終匹配字串的首尾,而新引入了^^ 和$$ 兩個元字元來匹配行的首尾。
過去我們常用的單行模式的替代品[^] 或者[\s\S] 也不是完全沒有用了,比如在一些使用JavaScript 正規的編輯器裡(VS Code、Atom),不太可能給你提供開啟單行模式的介面。不過說起編輯器裡的正規功能,用JavaScript 實現的編輯器的正規功能還是太弱了,比如不能在正則自身內部開啟某些模式,比如要是在Sublime(使用Python 正則)裡的話,在正則內部使用(?s) 就能開啟dotall 模式,例如可以用(?s)/\*.+?\*/ 配對到所有的多行註解。
以上是什麼是單行模式? JavaScript正規的單行模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。

如何在Quartz中提前發送任務通知在使用Quartz定時器進行任務調度時,任務的執行時間是由cron表達式設定的。現�...

在JavaScript中如何獲取原型鏈上函數的參數在JavaScript編程中,理解和操作原型鏈上的函數參數是常見且重要的任�...

在微信小程序web-view中使用Vue.js動態style位移失效的原因分析在使用Vue.js...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Dreamweaver CS6
視覺化網頁開發工具