談談正規表示式中的句號

2022-10-04 10:06:13 字數 1007 閱讀 5764

我們知道,正規表示式中,可以用 . 表示任意單個字元,但在underscore和jquery的源**中,我們可以看到,這些著名類庫的**中,經常並不是用 . 來表示任意字元,而是使用 [\w\w] 或者[\s\s]emiahd 。乍一看,好像表達的含義是一樣的,可是為什麼放著簡單的方法不用,而去多繞個圈子?今天就簡單說說這個問題。

首先我們必須要正確理解 . 的含義。其實說它表示任意單個字元,可能會讓人產生誤解,必須要強調一下,這個「任意單個字元」不包括控制換行的字元,也就是不包含 \n \r \uemiahd2028 或\u2029 這幾個字元。而 \w 和 \s 中是能夠包含這些字元的。那個這兩種寫法的差異也就很清晰了,就是能否匹配到幾個換行控制符的差異。

那麼在什麼時候我們需要考慮這幾個換行控制符呢?emiahd當要處理的字串可能包含換行時。這樣的情景太多了,處理html字串、處理template、nodej程式設計客棧s讀取文字等等。

提及多行文字的場景,我們很容易想到正規表示式的 m 模式(多行模式)。那麼多行模式對我們今天討論的問題有影響嗎?我不是很確定。為什麼不確定呢?有些人信誓旦旦地聲稱單行模式下 . 的含義與多行模式下不同,單選模式下等同於 [\w\w] 或者 [\s\s] ,而多行模式下會排除換行控制符。但據我試驗,以及參考mdn的說法,這是不對的。的確有很多語言的正規表示式會有上述特性,但在j**ascript中我沒有看到,不知道會不會有瀏覽器方面的差異。那麼多行模式對於j**ascript而言影響的是什麼呢?我認為僅僅是改變了 ^ 程式設計客棧和 $ 標識的含義:單行模式下,分別表示整個字串的開始的結尾;多行模式下表示每一行的開始和結尾。而不管多行模式還是單行模式,我認為 . 都是不包含換行控制字元的,等價於 [^\n\r\u2028\u2029] 。

再多延伸一點點,對於現代瀏覽器,可以直接用 [^] 來匹配任意字元的。

例子程式不想寫了,有興趣的可以自己試驗一下,分別用 /.*/g 、 /^.*$/g 、 /.*/gm 、/^.*$/gm 來匹配一下 "abc\nedf" ,其中道理不言自明。

本文標題: 談談正規表示式中的句號.

本文位址:

談談PHP的正規表示式

最近在寫乙個微博客戶端,很多邏輯功能實現想自己重新寫一遍。其中遇到微博的使用者名稱匹配問題。困擾了很久。終於解決,於是乎對php的正則匹配模式有了一定的認識。在這裡記錄一下,一來當作筆記以作以後的複習,二來也希望能跟大家分享一下經驗。但是其中遇到的就是當正規表示式中包含中文字元的時候 其實對於包含中...

python裡使用正規表示式的句號和星號

當我們想在正規表示式裡某個位置上只匹配乙個任意的字元時,可以使用句號 來實現,星號 是表0個或多個字元重複,例子如下 python 3.6 蔡軍生 from re test patterns import test patterns test patterns abbaabbba a.a follo...

sql正規表示式 SQL中的正規表示式

sql正規表示式 sql中的正規表示式 sql的查詢語句中,有時會需要引進正規表示式為其複雜搜尋指定模式。下面給出一些 regexp 在mysql 語句中應用 非全部 1 匹配字串的開始部分。mysql select fo nfo regexp fo 0mysql select fofo regex...