寫于2015年5月7日捻爷,可能已過(guò)時(shí),請(qǐng)謹(jǐn)慎參考份企。
今天分享一個(gè)小的知識(shí)點(diǎn),一個(gè)正則表達(dá)式方面的很容易被人忽視的坑巡莹。
我們知道司志,正則表達(dá)式中,可以用.
表示任意單個(gè)字符降宅,但在underscore和jquery的源代碼中骂远,我們可以看到,這些著名類庫(kù)的代碼中腰根,經(jīng)常并不是用.
來(lái)表示任意字符激才,而是使用[\w\W]
或者[\s\S]
。乍一看,好像表達(dá)的含義是一樣的瘸恼,可是為什么放著簡(jiǎn)單的方法不用劣挫,而去多繞個(gè)圈子?今天就簡(jiǎn)單說(shuō)說(shuō)這個(gè)問(wèn)題东帅。
首先我們必須要正確理解.
的含義压固。其實(shí)說(shuō)它表示任意單個(gè)字符,可能會(huì)讓人產(chǎn)生誤解靠闭,必須要強(qiáng)調(diào)一下帐我,這個(gè)“任意單個(gè)字符”不包括控制換行的字符,也就是不包含\n
愧膀、\r
拦键、\u2028
或\u2029
這幾個(gè)字符。而\W
和\s
中是能夠包含這些字符的檩淋。那個(gè)這兩種寫法的差異也就很清晰了芬为,就是能否匹配到幾個(gè)換行控制符的差異。
那么在什么時(shí)候我們需要考慮這幾個(gè)換行控制符呢狼钮?當(dāng)要處理的字符串可能包含換行時(shí)碳柱。這樣的情景太多了,處理html字符串熬芜、處理template莲镣、Node.js讀取文本等等。
提及多行文本的場(chǎng)景涎拉,我們很容易想到正則表達(dá)式的m
模式(多行模式)瑞侮。那么多行模式對(duì)我們今天討論的問(wèn)題有影響嗎?我不是很確定鼓拧。為什么不確定呢半火?有些人信誓旦旦地聲稱單行模式下 . 的含義與多行模式下不同,單選模式下等同于[\w\W]
或者[\s\S]
季俩,而多行模式下會(huì)排除換行控制符钮糖。但據(jù)我試驗(yàn),以及參考MDN的說(shuō)法酌住,這是不對(duì)的店归。的確有很多語(yǔ)言的正則表達(dá)式會(huì)有上述特性,但在javascript中我沒(méi)有看到酪我,不知道會(huì)不會(huì)有瀏覽器方面的差異消痛。那么多行模式對(duì)于javascript而言影響的是什么呢?我認(rèn)為僅僅是改變了^
和$
標(biāo)識(shí)的含義:?jiǎn)涡心J较露伎蓿謩e表示整個(gè)字符串的開(kāi)始的結(jié)尾秩伞;多行模式下表示每一行的開(kāi)始和結(jié)尾逞带。而不管多行模式還是單行模式,我認(rèn)為.
都是不包含換行控制字符的纱新,等價(jià)于[^\n\r\u2028\u2029]
展氓。
再多延伸一點(diǎn)點(diǎn),對(duì)于現(xiàn)代瀏覽器怒炸,可以直接用[^]
來(lái)匹配任意字符的带饱。
例子不想寫了,有興趣的可以自己試驗(yàn)一下阅羹,分別用/.*/g
勺疼、/^.*$/g
、/.*/gm
捏鱼、/^.*$/gm
來(lái)匹配一下"abc\nedf"
执庐,其中道理不言自明。