成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

正則表達式易錯點小結(jié)!

邱勇 / 2532人閱讀

摘要:舉例說明百度谷歌正則如下結(jié)果是把全部的字符串都匹配到了其實,我們只需要加上修飾符,這樣,這樣一旦成功匹配一次的話,正則就不會繼續(xù)進行匹配了個人認為應該是的意思,表示在匹配的時候忽略大小寫。

最近在學習正則表達式,發(fā)現(xiàn)原來理解的正則表達式不是特別的準確,甚至有誤!在這里簡單記錄一下,希望對有的朋友能夠有所幫助!

①“[]”:字符集(字符簇,字符組……)
他的真正含義是"或"的意思!例如:[123],它代表的含義是,匹配一個1或2或3!

由于它經(jīng)常是用于匹配多個可能的值,所以支持一種簡寫的方式! 例如:[12345678]可以簡寫為[1-8]
[abcdefghjik]可以簡寫為[a-k] [1234567ABCDEFG]可以簡寫為[1-7A-G]

“[]”相關(guān)的陷阱!
(1)在”[]”中的大部分元字符都是普通字符,都不在具有元字符的含義!但是仍然有個別的元字符除外!
“-”,“^”,目前只知道這兩個,可能還有其他的,待補充!

“-”,是作為連字符表示的是一個范圍,

如果多帶帶的將“-”符號放在第一位的話,它表示的也是一個普通的字符!例如:[a-z]這個時候就是元字符,代表的是一個范圍!

在[-abc]中,"-"就是一個普通的字符,這句話就表示,匹配-、a、b、c中,這四個字符中的任意一個!

^有兩個意思,

在字符簇外,它表示的是托字節(jié),匹配的是一個位置!

而在字符簇中相當于取反的意思!而且只有當托字節(jié)放在字符簇的第一個位置的時候才會表示一個元字符!

    array(5) { [0]=> string(2) "q " [1]=> string(2) "qi"[2]=> string(2) "qr" [3]=> string(2) "qi" [4]=>string(2) "qq" } }
?>
     
可能會有的朋友問Iraq中q后面匹配了什么!答案是回車(在window狀態(tài)下是
)!
并不屬于udfg中的任意字符所以匹配成功!
在heredoc的語法中,會完整的保留空格、制表符、回車換行!
②“|”表示或的意思!它代表一個分支語句!
到這里,可能有的朋友會問,那他的功能豈不是和 ”[]” 的功能重復了么?

答案顯然是否定的!個人認為“|”,分支語句,在一定程度上彌補了“[]”符號功能的不足!因為“[]”,自始至終只能表示一個字字符!

例如:[a-z],他表示的匹配a-z中的任意一個字符!

而當我們需要匹配abc或def的時候,顯然”[]”是無能為力的!而此時也正是“|”分支結(jié)構(gòu)的用處!可以寫成(abc|def)

表示匹配abc或者def這兩個字符集中的一個!

③“?”表示可選項!它只作用于之前緊鄰的元素!
這里我們需要明白一下元素的概念!所謂元素還包括如下的形式:[a-z]這個字符簇整體表示一個元素!(abc|def)這個分支結(jié)構(gòu)整體表示一個元素!
注意:所有的量詞都是僅作用于之前緊鄰的元素!
④正則中的反向引用
在正則表達式中,使用”()”包裹起來的元素被統(tǒng)一稱為子表達式!而括號是能夠記憶“()”匹配到的內(nèi)容的,無論這些匹配到的文本是什么!(這個也就是我們常說的反向引用!如果他是第一個的話使用1,就可以獲得字表達式中的內(nèi)容!)
那么如果判斷是表達式幾呢?有一個原則:按照開括號“(”從左到右的出現(xiàn)順序進行計算!依次就是1,2,3…… 注意:反向引用應該是可以嵌套的!遵循的同樣是這個原則!看代碼:
 string(8) "maweibin" [1]=> string(8) "maweibin" [2]=> string(5) "mawei" [3]=> string(2) "ma" } 
?>

通過結(jié)果,我們可以看到,第一個字表達式是“maweibin”,第二個字表達式是“mawei”,第三個字表達式是“ma”。
⑤正則表達式中的“$”陷阱!

在正則表達式中“$”符號,同托字節(jié)“^”一樣是匹配一個位置的!但是“$”符號本身又有一些陷阱需要我們注意!
一般情況下,我們都認為“$”符號匹配就是一行中的最后一個位置!這個并沒有錯,但是不夠詳細!
其實$匹配的是這樣一個位置,匹配n前或單行字串的結(jié)束位置,單行字符串結(jié)尾什么都沒有!舉例說明:

 array(1) { [0]=>string(14) "your yourselef" } [1]=> array(1) { [0]=> string(4)"your" } }
?>
只有最后一個被匹配到了! 、
原因是這樣的!在window中每換一行會有隱藏字符“ ”存在!
$匹配 前或字串結(jié)尾(字符串結(jié)尾,比如多帶帶一行的最后), 也是一個字符,且不在[a-zA-Z]范圍!其實,我們只需要將正則改寫為"/^([a-zA-Z]+)s*1[a-zA-Z] s$/m",這里只是加上了一個s*用來匹配r這個看不見的字符串!
⑥關(guān)于正則表達在多行匹配中的應用!

正則表達式大多數(shù)情況下是進行單行的匹配的!但是,有時候我們也需要進行多行的匹配,特別是在我們進行信息采集的時候,顯得就尤為重要!
個人認為,在php中如果我們能夠靈活的運用php的模式修飾符,那么多行匹配就沒有什么問題了!所以多行匹配,個人認為就是重點對模式修飾符的學習!

(1)m(mutiline),加上了m修飾符號的主要作用是更改了托字節(jié)”^”和“$”的應用范圍!
黑色箭頭代表的是托字節(jié)”^”所匹配的位置,藍色箭頭是美元符號”%”所匹配的位置! 舉例說明:

從上面,我們可以看出來:在沒有m修飾符的時候,托字節(jié)^僅匹配字符串的開始位置,
而$僅匹配字符串的末尾,或者最后的換行符號!
加上了m修飾符之后:

從上面,我們可以看出來:加上m修飾符后,托字節(jié)^會匹配目標字符串的開始,或者任意換行符n前面的位置; 而$會匹配目標字符串的最末位置,或者任意換行符后面的位置!
(2)S修飾,如果設(shè)置了這個修飾符那么,模式中的元字符 “ . ” 就會匹配所有字符, 包含換行符. 如果沒有這個修飾符, 那么 “ . ”實際上匹配的是除了換行符n外的任意字符!

(3)U(這個是大寫的ungreedy:非貪婪)。

舉例說明:
百度谷歌
正則如下:.*結(jié)果是把全部的字符串都匹配到了!其實,我們只需要加上U修飾符,這樣,這樣一旦成功匹配一次的話,正則就不會繼續(xù)進行匹配了!

(4)i(個人認為應該是ingnore的意思),表示在匹配的時候忽略大小寫。

⑦最左端文本優(yōu)先匹配 && 標準的匹配量詞是匹配優(yōu)先的

好抽象,還是舉個例子吧:

文本:this is March, March1998
正則:March[0-9]+
匹配過程:
1. 正則中的一個字符M從文本對最左面開始嘗試匹配,發(fā)現(xiàn)第一個字符是t,并不匹配,換到下一個字符h仍不滿足,于是繼續(xù)下一個字符,直到遇到第一個大寫字符M;
2. 正則中第二個字符a, 從M字符后面繼續(xù)開始匹配,同樣滿足,于是r字符。就這樣,March單詞在文本中都得到了匹配。直到遇到了[0-9]+
3. 此時,由于標準匹配量詞優(yōu)先原則,先檢測到了+, 聲明了在接下來對匹配中,前面對字符要嘗試匹配1次到任意對多次
4. 此時,發(fā)現(xiàn) " , " 字符并不滿足數(shù)字至少出現(xiàn)一次對需求,所以本輪匹配失敗,接著來吧。
5. 接著字符 " , ", 接著往下匹配M字符不符合空格,接著下一個字符。發(fā)現(xiàn)M字符得到了匹配,緊接著a字符 r字符 c字符 h字符。此時接下來要執(zhí)行的步驟同步驟3一模一樣,這次得到了滿足。



![圖片上傳中...]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/20723.html

相關(guān)文章

  • JavaScript:面試頻繁出現(xiàn)的幾個錯點

    摘要:針對于面向?qū)ο缶幊痰?。因為面向?qū)ο缶褪轻槍ο罄又械氖睾騺磉M行執(zhí)行某些動作。這就是閉包的用途之一延續(xù)變量周期。把變量放在閉包里面和放在全局變量里面,影響是一致的。 1.前言 這段時間,金三銀四,很多人面試,很多人分享面試題。在前段時間,我也臨時擔任面試官,為了大概了解面試者的水平,我也寫了一份題目,面試了幾個前端開發(fā)者。在這段時間里面,我在學,在寫設(shè)計模式的一些知識,想不到的設(shè)計模式...

    VincentFF 評論0 收藏0
  • forEach、map、filter、find、sort、some等錯點整理

    摘要:最近手頭上做了一個很大的后臺管理項目,前端對復雜數(shù)據(jù)的處理要求頗高,也確實讓自己發(fā)現(xiàn)了很多之前被忽視的細節(jié)。鳴人佐助卡卡西佐助佐助佐助但是很遺憾及更早版本也不支持。 ??最近手頭上做了一個很大的后臺管理項目,前端對復雜數(shù)據(jù)的處理要求頗高,也確實讓自己發(fā)現(xiàn)了很多之前被忽視的細節(jié)。在此特整理出來,希望不熟悉的朋友們們以后可以繞開我踩的這些坑。本文初衷在于幫助大家梳理一些數(shù)組操作上的重點和易...

    AJie 評論0 收藏0
  • 指針方面相關(guān)內(nèi)容,及其錯點

    摘要:文章目錄前言一丶野指針指針的運算指針整數(shù)指針指針指針的關(guān)系運算二字符指針三指針數(shù)組與數(shù)組指針指針數(shù)組數(shù)組指針四數(shù)組名與數(shù)組名五數(shù)組參數(shù)指針參數(shù)一維數(shù)組傳參二維數(shù)組傳參一級指針傳參二級指針傳參六丶函數(shù)指針函數(shù)指針即指 ...

    linkFly 評論0 收藏0
  • docker命令錯點整理

    摘要:拷貝目錄的話,是拷貝目錄里頭的文件,不包括目錄本身原樣拷貝,不支持遠程文件設(shè)置指令只能存在一個,多個的話,執(zhí)行最后的那一個。設(shè)置鏡像的元屬性指定被其他鏡像作為基礎(chǔ)鏡像時運行的操作指令指定確保服務出現(xiàn)任何問題而意外結(jié)束時,自動重新啟動。 pause docker pause可以暫時停止容器,以釋放一部分CPU出來給其他服務使用docker unpause可以解凍 docker stop ...

    YacaToy 評論0 收藏0
  • python 一些錯點整理

    摘要:與比較中與比較關(guān)鍵字用來在函數(shù)或其他局部作用域中使用全局變量。親自動手試后,發(fā)現(xiàn)使用了只會讀閉包內(nèi)的變量,可以隔著多層上一哥們類比看作為步驟 這篇文章是抄抄寫寫得來的,純粹是這個編輯器比筆記的好太多,才在這兒寫。 函數(shù)參數(shù)傳遞 Python的函數(shù)參數(shù)傳遞 對于變量(與對象相對的概念),其實,python函數(shù)參數(shù)傳遞可以理解為就是變量傳值操作,用C++的方式理解,就是對void*賦值。如...

    Lemon_95 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<