首頁  >  文章  >  新手入門學習正規表示式的常見錯誤

新手入門學習正規表示式的常見錯誤

angryTom
angryTom轉載
2019-11-09 17:42:563772瀏覽

正規的好處就是易於上手,透過幾個小時的學習,大部分的正則就都可以看的懂了,雖然看得懂,但在實踐的過程中還是會遇到很多得不到自己想要結果的情況,畢竟正規的語法還是有些奇怪,本文就整理了一些關於在正規學習過程中常會犯的錯誤。

新手入門學習正規表示式的常見錯誤

正規表示式

#一、空格

我們在平常寫程式碼的時候,空格通常是用來是讓程式碼更規範的工具,連同適當的縮排,行首的tab一起,讓程式碼看起來更為清晰。但在正則中可要小心了-空格本身也屬於一個要匹配的字符,不恰當的使用空格的話:

echo preg_match('/a{1, 3}/', "aaa") ? '匹配' : '不匹配';  // 不匹配

如上面這個正則,本意是匹配1~3個a,但實際上並不會配對到後面的3個a,因為{1, 3}中間多了一個空格,使得元字元「{}」的本意失效而變成了普通字元:

echo preg_match('/a{1, 3}/', "a{1, 3}") ? '匹配' : '不匹配';  // 匹配

「a {1, 3}」這個字串反而匹配上了,這顯然不是我們想要的,所以一定要注意,除非匹配的是空格字符本身,否則空格不要用:

echo preg_match('/a{1,3}/', "aaa") ? '匹配' : '不匹配';  // 匹配

※ 例外的,模式修飾符x可以將正則字串的空白字符忽略掉——然而只能忽略掉數據字符,像上例中的元字符中的空格還是會出現錯誤,通常來說這會讓正則變的更加難以理解,不太推薦使用:

echo preg_match('/a a a/x', "aaa") ? '匹配' : '不匹配';  // 匹配

二、大小寫

這個很好理解,基本上就是一個粗心大意的錯誤,畢竟我們平常用的搜尋工具裡搜尋字母通常大小寫都會被匹配,有時就會忘記正則中並不會自動的匹配大小寫:

echo preg_match('/flag/', "Flag") ? '匹配' : '不匹配';  // 不匹配

像這樣匹配的字符串中可能有首字母大寫的情況,自然就匹配不到了,這時候我們就要把大小寫的狀況都要考慮進來。不過有時候我們想要匹配某個單詞,只要是這4個字母連在一起都要匹配,寫起來就比較麻煩:

echo preg_match('/[Ff][Ll][Aa][Gg]/', "Flag") ? '匹配' : '不匹配';  // 匹配

雖然很難想像會有“fLaG”這種奇葩的寫法,但是不這樣寫畢竟無法匹配所有情況,但是有時候我們並不關心大小寫,要匹配的字符串卻很長,都這樣寫怕是要累死了,不過還好我們有“i”修飾符:

echo preg_match('/flag/i', "Flag") ? '匹配' : '不匹配';  // 匹配

修飾符「i」設定後,模式中的大小寫匹配將會不敏感。

三、貪婪模式

量詞「 」和「*」預設都是貪婪模式的,初學者在未遇到它所帶來的問題之前可能不明白這是什麼意思,下面kano來舉一個例子:

preg_match_all(&#39;/<span>.*<\/span>/&#39;, "<span>aaa</span><span>bbb</span>", $matches);
var_dump($matches);

新手入門學習正規表示式的常見錯誤

#正則的本意是找出字串中所有的span標籤,並把他們放到的一個數組中,然而結果很奇怪:兩個span竟然一次都被匹配上了!實際上想一想的話這也是合理的,字符串“aaabbb”確實是以開頭並以結尾的,只不過其中的.*匹配了太多的內容“aaabbb”都被匹配上了。這就是「 」和「*」的貪婪模式——預設他們會匹配盡量多的字符,而在後面加一個「?」可以取消這種貪婪模式,讓他們只匹配盡量少的內容:

preg_match_all(&#39;/<span>.*?<\/span>/&#39;, "<span>aaa</span><span>bbb</span>", $matches);
var_dump($matches);

新手入門學習正規表示式的常見錯誤

這次我們得到了想要的結果。

正規的語法比較特殊,若是不注意的話還是比較容易採坑的。

推薦學習:《正規表示式極速入門

以上是新手入門學習正規表示式的常見錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:www.kanoseo.cn。如有侵權,請聯絡admin@php.cn刪除