JS正規的單行模式詳解
這次帶給大家JS正規的單行模式詳解,使用JS正規單行模式的注意事項有哪些,以下就是實戰案例,一起來看一下。
正規表示式最早是由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 提案 https://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)/\*.+?\*/ 匹配到所有的多行注释。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上是JS正規的單行模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

微信勿擾模式什麼意思如今,隨著智慧型手機的普及和行動網路的快速發展,社群媒體平台已成為人們日常生活中不可或缺的一部分。而微信作為國內最受歡迎的社群媒體平台之一,幾乎每個人都有一個微信帳號。我們可以透過微信與朋友、家人、同事進行即時溝通,分享生活中的點滴,了解彼此的近況。然而,在這個時代,我們也不可避免地面臨資訊過載和隱私洩漏的問題,特別是對於那些需要專注或

Windows作業系統是全球最受歡迎的作業系統之一,其新版本Win11備受矚目。在Win11系統中,管理員權限的取得是一個重要的操作,管理員權限可以讓使用者對系統進行更多的操作和設定。本文將詳細介紹在Win11系統中如何取得管理員權限,以及如何有效地管理權限。在Win11系統中,管理員權限分為本機管理員和網域管理員兩種。本機管理員是指具有對本機電腦的完全管理權限

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

即使在「請勿打擾」模式下接聽電話也可能是一種非常煩人的體驗。顧名思義,請勿打擾模式可關閉來自郵件、訊息等的所有來電通知和警報。您可以按照這些解決方案集進行修復。修復1–啟用對焦模式在手機上啟用對焦模式。步驟1–從頂部向下滑動以存取控制中心。步驟2–接下來,在手機上啟用「對焦模式」。專注模式可在手機上啟用「請勿打擾」模式。它不會讓您的手機上出現任何來電提醒。修復2–更改對焦模式設定如果對焦模式設定中存在一些問題,則應進行修復。步驟1–打開您的iPhone設定視窗。步驟2–接下來,開啟「對焦」模式設

PHP中的模運算子(%)是用來取得兩個數值相除的餘數的。在本文中,我們將詳細討論模運算子的作用及用法,並提供具體的程式碼範例來幫助讀者更好地理解。 1.模運算子的作用在數學中,當我們將一個整數除以另一個整數時,就會得到一個商和一個餘數。例如,當我們將10除以3時,商數為3,餘數為1。模運算子就是用來取得這個餘數的。 2.模運算子的用法在PHP中,使用%符號來表示模

Linux系統呼叫system()函數詳解系統呼叫是Linux作業系統中非常重要的一部分,它提供了一種與系統核心互動的方式。其中,system()函數是常用的系統呼叫函數之一。本文將詳細介紹system()函數的使用方法,並提供對應的程式碼範例。系統呼叫的基本概念系統呼叫是使用者程式與作業系統核心互動的一種方式。使用者程式透過呼叫系統呼叫函數來請求作業系統

Linux的curl命令詳解摘要:curl是一種強大的命令列工具,用於與伺服器進行資料通訊。本文將介紹curl指令的基本用法,並提供實際的程式碼範例,幫助讀者更好地理解和應用該指令。一、curl是什麼? curl是命令列工具,用於發送和接收各種網路請求。它支援多種協議,如HTTP、FTP、TELNET等,並提供了豐富的功能,如檔案上傳、檔案下載、資料傳輸、代

Promise.resolve()詳解,需要具體程式碼範例Promise是JavaScript中一種用來處理非同步操作的機制。在實際開發中,常常需要處理一些需要依序執行的非同步任務,而Promise.resolve()方法就是用來傳回一個已經Fulfilled狀態的Promise物件。 Promise.resolve()是Promise類別的靜態方法,它接受一個
