談?wù)務(wù)齽t表達(dá)式中的句號.
我們知道,正則表達(dá)式中,可以用 . 表示任意單個字符,但在underscore和jquery的源代碼中,我們可以看到,這些著名類庫的代碼中,經(jīng)常并不是用 . 來表示任意字符,而是使用 [\w\W] 或者[\s\S] 。乍一看,好像表達(dá)的含義是一樣的,可是為什么放著簡單的方法不用,而去多繞個圈子?今天就簡單說說這個問題。
首先我們必須要正確理解 . 的含義。其實說它表示任意單個字符,可能會讓人產(chǎn)生誤解,必須要強(qiáng)調(diào)一下,這個“任意單個字符”不包括控制換行的字符,也就是不包含 \n \r \u2028 或\u2029 這幾個字符。而 \W 和 \s 中是能夠包含這些字符的。那個這兩種寫法的差異也就很清晰了,就是能否匹配到幾個換行控制符的差異。
那么在什么時候我們需要考慮這幾個換行控制符呢?當(dāng)要處理的字符串可能包含換行時。這樣的情景太多了,處理html字符串、處理template、nodejs讀取文本等等。
提及多行文本的場景,我們很容易想到正則表達(dá)式的 m 模式(多行模式)。那么多行模式對我們今天討論的問題有影響嗎?我不是很確定。為什么不確定呢?有些人信誓旦旦地聲稱單行模式下 . 的含義與多行模式下不同,單選模式下等同于 [\w\W] 或者 [\s\S] ,而多行模式下會排除換行控制符。但據(jù)我試驗,以及參考MDN的說法,這是不對的。的確有很多語言的正則表達(dá)式會有上述特性,但在javascript中我沒有看到,不知道會不會有瀏覽器方面的差異。那么多行模式對于javascript而言影響的是什么呢?我認(rèn)為僅僅是改變了 ^ 和 $ 標(biāo)識的含義:單行模式下,分別表示整個字符串的開始的結(jié)尾;多行模式下表示每一行的開始和結(jié)尾。而不管多行模式還是單行模式,我認(rèn)為 . 都是不包含換行控制字符的,等價于 [^\n\r\u2028\u2029] 。
再多延伸一點(diǎn)點(diǎn),對于現(xiàn)代瀏覽器,可以直接用 [^] 來匹配任意字符的。
例子程序不想寫了,有興趣的可以自己試驗一下,分別用 /.*/g 、 /^.*$/g 、 /.*/gm 、/^.*$/gm 來匹配一下 "abc\nedf" ,其中道理不言自明。
相關(guān)文章
積累比較常用的正則表達(dá)式(例如:匹配中文、匹配html)
本文是小編在日常工作中積累并整理的有關(guān)一些常用的正則表達(dá)式(例如:匹配中文、匹配html),在此把全部內(nèi)容分享在腳本之家網(wǎng)站,需要的朋友可以來腳本之家網(wǎng)站學(xué)習(xí)2015-10-10用正則表達(dá)式匹配字符串中漢字及中文標(biāo)點(diǎn)符號
正則表達(dá)式通常用于判斷某一個字符串是否符合或滿足某一種格式,下面這篇文章主要給大家介紹了關(guān)于如何使用正則表達(dá)式匹配字符串中漢字及中文標(biāo)點(diǎn)符號的相關(guān)資料,需要的朋友可以參考下2022-07-07java正則表達(dá)式獲取大括號小括號內(nèi)容并判斷數(shù)字和小數(shù)親測可用
這篇文章主要介紹了java正則表達(dá)式獲取大括號小括號內(nèi)容并判斷數(shù)字和小數(shù)親測可用,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06asp提取內(nèi)容中的手機(jī)號碼,qq,網(wǎng)址的正則代碼
有時候需要獲取頁面源代碼中的手機(jī)號碼,qq,網(wǎng)址,一般情況下都是用正則表達(dá)式實現(xiàn)的,需要的朋友可以參考下。2011-09-09常用正則表達(dá)式及評注-學(xué)習(xí)正則必備
2008-02-02javascript 數(shù)字的正則表達(dá)式集合
這里收集的是驗證數(shù)字的正則表達(dá)式集合,比較的全了,需要驗證數(shù)字的朋友很值得參考下。2010-04-04Java用正則對字符串進(jìn)行處理并判斷是否能轉(zhuǎn)為數(shù)字
這篇文章主要介紹了Java用正則對字符串進(jìn)行處理并判斷是否能轉(zhuǎn)為數(shù)字的實例代碼,代碼很簡單,需要的朋友可以參考下2018-06-06