帶您一小時玩轉正則表達式

2021-01-11 成為一名架構師

在日常開發中我們經常會對用戶輸入的數據進行校驗、對字符串進行提取或者替換,這時候往往會使用正則來實現,那麼今天我給大家分享下正則表達式的一些知識。

一、什麼是正則表達式

正則表達式是一種描述字符串結果的語法規則,是一個特定的格式化模式,可以匹配、替換、截取匹配的字符串。

二、基礎知識

1、行定位符

行定位符是用來描述字符串的邊界。「^」表示行開始,「$」表示行結尾。

如:

"^de",表示以de開頭的字符串

"de$",表示以de結尾的字符串。

如:

^tm:tm equal Tomorrow Moon就可以匹配,而Tomorrow Moon equal tm就不可以匹配.但是如果使用:tm$:則後者可以匹配而前者不可以。如果想要匹配的字串可以出現在字符串的任意部分,那麼可以直接寫成:tm這樣兩者就都能夠匹配了。

2、單詞定界符 \b和\B

我們在查找的一個單詞的時候,如an是否在一個字符串」gril and body」中存在,很明顯如果匹配的話,an肯定是可以匹配字符串「gril and body」匹配到,怎樣才能讓其匹配單詞,而不是單詞的一部分呢?這時候,我們可以是喲個單詞定界符\b。\ban\b 去匹配」gril and body」的話,就會提示匹配不到。當然還有一個大寫的\B,它的意思,和\b正好相反,它匹配的字符串不能是一個完整的單詞,而是其他單詞或字符串中的一部分。如\Ban\B。

3、選擇字符(|) ,表示或

選擇字符表示或的意思。如Aa|aA,表示Aa或者是aA的意思。注意使用」[]」與」|」的區別,在於"[]」只能匹配單個字符,而「|」可以匹配任意長度的字符串。在使用」[]」的時候,往往配合連接字符」-「一起使用,如[a-d],代表a或b或c或d。

4、排除字符,排除操作

正則表達式提供了」^」來表示排除不符合的字符,^一般放在[]中。如[^1-5],該字符不是1~5之間的數字。

5、限定符(?*+{n,m})

限定符主要是用來限定每個字符串出現的次數。

如(D+)表示一個或多個D

6、點號操作符

匹配任意一個字符(不包含換行符)

7、表達式中的反斜槓(\)

表達式中的反斜槓有多重意義,如轉義、指定預定義的字符集、定義斷言、顯示不列印的字符。

8、轉義字符

轉義字符主要是將一些特殊字符轉為普通字符。而這些常用特殊字符有」.」,」?」、」\」等。

指定預定義的字符集

顯示不可列印的字符

9、括號字符()

在正則表達式中小括號的作用主要有:

改變限定符 如(|、* 、^)的作用範圍如(my|your)baby,如果沒有」()」,|將匹配的是要麼是my,要麼是yourbaby,有了小括號,匹配的就是mybaby或yourbaby。進行分組,便於反向引用10、反向引用

反向引用,就是依靠子表達式的」記憶」功能,匹配連續出現的字串或是字符。如(dqs)(pps)\1\2,表示匹配字符串dqsppsdqspps。

例1:

判斷字符串」I am a good boy」中是否包含3個相同的字母

解析:此時,如果我們不使用正則,將會很難判斷,因為字母太多了,我們不可能去將所有字母分別與該字符串比較,那樣工作量也比較大。這時候涉及到了正則的反向引用。在php正則表達式中,通過\n,來表示第n次匹配到的結果。如\5代表第五次匹配到的結果。那麼本題的$pattern='/(\w).*\1.*\1/';

注意:在使用反向匹配的時候都需要使用(),反向匹配時,匹配()裡面出現的字符或字符串。

例2:

去除字符串」gawwenngeeojjgegop」中連續相同的字母

<?php$str='gawwenngeeojjgegop';$pattern='/(.)\1/';$str=preg_replace($pattern,'',$str);

print_r($str);

解析:當然這樣可能會遇到,當第一次去除了重複了字符串後,又出來重複的字符串。如字符串味』gewwenngeeojjgegop』,針對這中問題,當然,這樣的話,通過判斷,繼續替換下去。

例3:

將字符串中」age13gegep3iorji65k65k」;中出現的連續兩個數字改為第二個數字,如字符串中13被改為3

<?php$str='age13gegep3iorji65k65k';$pattern='/(\d)(\d)/';$str=preg_replace($pattern,'$2',$str);

print_r($str);

解析:$n在正則表達式外使用反向引用。n代表第幾次匹配到的結果(n從1開始)。

11、模式修飾符

模式修飾符的作用是設定模式,也就是正則表達式如何解釋。php中主要模式如下表:

三、貪婪匹配與惰性匹配

1、貪婪匹配:就是匹配儘可能多的字符。

比如,正則表達式中m.*n,它將匹配最長以m開始,n結尾的字符串。如果用它來搜索manmpndegenc的話,它將匹配到的字符串是manmpndegen而非man。可以這樣想,當匹配到m的時候,它將從後面往前匹配字符n。

2、懶惰匹配:就是匹配儘可能少的字符。

有的時候,我們需要並不是去貪婪匹配,而是儘可能少的去匹配。這時候,就需要將其轉為惰性匹配。怎樣將一個貪婪匹配轉為惰性匹配呢?只需要在其後面添加一個」?」即可。如m.*?n將匹配manmpndegenc,匹配到的字符串是man。

四、PHP常用正則相關函數

1、preg_match

該函數是進行正則表達式的匹配,成功返回1,否則返回0

2、preg_match_all

該函數用於執行一個全局正則表達式匹配,與preg_match不同的是,該函數是匹配所有符合條件內容。

3、preg_replace

該函數執行一個正則表達式的搜索和替換。

五、PHP示例

1、匹配手機號碼

<?php$str = '13141081058';$re = preg_match('/^1[3456789]\d{9}$/s',$str,$arr);print_r($re);print_r($arr);

輸出結果:

1

Array ( [0] => 13141081058 )

2、匹配E-mail

<?php$str = 'wafu7969@qq.com';$re = preg_match('/^(.+)@(.+)\.(.+)$/s',$str,$arr);print_r($re);print_r($arr);

輸出結果:

1

Array ( [0] => wafu7969@qq.com [1] => wafu7969 [2] => qq [3] => com )

3、URL 中取出域名

<?php$str = 'http://www.baidu.com/?search=強哥';$re = preg_match('/^(http:\/\/|https:\/\/)(.+)\//s',$str,$arr);print_r($re);print_r($arr[0]);

輸出結果:

1

http://www.baidu.com/

4、查找匹配 <b> 與 </b> 標籤的內容

單個p標籤:

<?php$str = '<p>我是強哥</p>';$re = preg_match('/^<p>(.*)<\/p>/s',$str,$arr);print_r($re);print_r($arr[1]);

輸出結果:

1

我是強哥

多個p標籤:

<?php$str = '<p>我是強哥</p><p>你是誰呢?</p>';$re = preg_match_all('/<p>(.*?)<\/p>/m',$str,$arr);print_r($re);print_r($arr[1]);

輸出結果:

2

Array

(

[0] => 我是強哥

[1] => 你是誰呢?

)

注意:這裡要用惰性匹配,注意(.*?)裡面的?。

5、提取圖片的地址

<?php$str = '<img src="http://www.baidu.com/meinv.jpg" />';$re = preg_match('/<img src="(.*)" \/>/s',$str,$arr);print_r($re);print_r($arr[1]);

輸出結果:

1

http://www.baidu.com/meinv.jpg

5、正則替換

把<p></p>中的「我是強哥」替換成「我是誰」

<?php$str = '<p>我是強哥</p>';$str = preg_replace('/^(<p>)(.*)(<\/p>)$/s','\1我是誰\3',$str);print_r($str);

輸出結果:

這裡用到了反向引用,使用反向引用的時候一定要注意:在使用反向匹配的時候都需要使用(),反向匹配時,匹配()裡面出現的字符或字符串。

相關焦點

  • 正則表達式在VBA中間是如何應用?正則表達式的實現方式?
    Hi,大家好,本章節開始將會從零開始和大家用圖文的方式,讓你從零基礎學會正則表達式!有興趣的小夥伴可以持續關注我,或者在專欄中進行查看自我學習,願與君攜手前行!在上一個章節說到正則表達式的入門級知識點,本節將會與大家分享一下正則表達式的是具體實現方式是怎麼樣的?
  • 給JAVA程式設計師的正則表達式一課
    「不會正則表達式,就算寫遍代碼也嘛不是」。說到正則表達式,可能動態語言的碼農Perl,Python,JS甚至是Golang的開發人員可能都熟悉。對Java碼農來說,可能CURD手到擒來,Spring Stuts Hibernat耳聞能詳,但是說到Regex RE模式,可能熟練的少。那麼,今天蟲蟲就來給廣大Java碼農來補補正則的課。
  • 使用JavaScript對正則表達式進行解析
    這是因為每種程式語言都可以在其正則表達式中定義某些默認值或特殊行為,這些默認值或特殊行為可能會彼此不同。對此感到抱歉,但事實就是如此。當我們構建RegEx時,儘管大多數程式語言在大多數情況下都是相同的,但是在其他地方使用它之前,您必須對其進行測試並在必要時進行調整。
  • Python「正則表達式」詳解(上)
    大家好,今天我們一起學習以下Python中的「正則表達式」,說到正則表達式,大家可能比較陌生,不過我卻要告訴你,你每天都在使用正則表達式,不要不承認,就問你最常見的,瀏覽器每天用不?淘寶經常逛不?你在搜索框裡輸入幾個文字,按下回車,就出來大量結果,你想想這是怎麼辦到的,是正則表達式,可以好不誇張的講,沒有正則表達式,就沒有搜尋引擎。
  • Python正則表達式由淺入深(一)
    幸運的是Python提供了re模塊,可以實現正則表達式的操作。re模塊主要通過六大方法來對字符串進行處理,包括:match()、search()、findall()、split()、sub()。這些方法涉及到字符串的匹配與替換等操作,在接下來的4篇連載文章裡,我們不單只會講解這4種方法,還會把元字符、行定位符、限定符、字符類、排除字符、選擇字符、轉義字符、分組等正則表達式最常用知識點貫穿起來。
  • Python 正則表達式-函數用法分析
    Python正則表達式的主要作用是檢索、替換符合匹配規則的文本,什麼時候檢索,什麼時候替換,我們根據需求,選擇最合適的函數。【函數一】compile(pattern, flags=0)我們編寫的正則表達式 pattern,指定使用的模式 flags 默認為0 即不使用任何模式【函數二】 purge()這個函數的作用是清除緩存中的正則表達式【函數三】escape(pattern)如果需要操作的文本中含有正則的元字符時,需要將元字符加上反斜扛
  • 正則表達式與神經網絡的深度融合
    在這篇論文中,我們提出了直接由正則表達式轉化而來的神經網絡:FA-RNN (Finite Automata - Recurrent Neural Networks),將其使用在文本分類任務上,使得基於 FA-RNN 的系統在未經訓練的情況下與正則表達式文本分類系統有著相似的準確率。同時,FA-RNN 兼備神經網絡可訓練、可泛化的優點。
  • 正則表達式和 CPU 100%有什麼故事?
    其實這裡導致 CPU 使用率高的關鍵原因就是:Java 正則表達式使用的引擎實現是 NFA 自動機,這種正則表達式引擎在進行字符匹配時會發生回溯(backtracking)。而一旦發生回溯,那其消耗的時間就會變得很長,有可能是幾分鐘,也有可能是幾個小時,時間長短取決於回溯的次數和複雜度。看到這裡,可能大家還不是很清楚什麼是回溯,還有點懵。
  • 正則表達式:如何匹配一個或多個字符?
    讀懂正則表達式就這麼簡單匹配純文本Ben是一個正則表達式。因為本身是純文本,所以看起來可能不像是一個正則表達式,但它的確是。正則表達式可以包含純文本(甚至可以只包含純文本)。當然,像這樣使用正則表達式是一種浪費,但把它作為我們學習正則表達式的起點還是很不錯的。
  • PHP正則表達式的快速學習方法
    此外,象JavaScript這種客戶端的腳本語言也提供了對正則表達式的支持。由此可見,正則表達式已經超出了某種語言或某個系統的局限,成為人們廣為接受的概念和功能。正則表達式可以讓用戶通過使用一系列的特殊字符構建匹配模式,然後把匹配模式與數據文件、程序輸入以及WEB頁面的表單輸入等目標對象進行比較,根據比較對象中是否包含匹配模式,執行相應的程序。
  • 正則表達式A - 方法及特殊字符用法
    課程大綱 1.正則表達式的概念及作用 2.正則表達式的創建方法 3.正則表達式的用法 正則表達式概念: 正則表達式是由普通字符及特殊字符組成的對字符串進行過濾的邏輯公式 正則表達式的創建方式: 1.字面量方式創建 (隱式創建): var reg = /正則表達式/gi;
  • Python程式語言:如何運用正則表達式
    這篇文章,小編要和大家分享的知識是Python語言的正則表達式,以及自己學到的使用方法!學會正則表達式可以幫助我們抓取網絡信息,正則表達式又叫Re庫!這裡我們要了解什麼是正則表達式,正則表達式是用來簡潔表達一組字符串的表達式!
  • MySQL如何使用正則表達式?(代碼示例)
    MySQL支持基於正則表達式和regexp運算符的另一種模式的匹配操作。下面本篇文章就帶大家認識一下MySQL的正則表達式(Regexp),通過示例來簡單介紹在MySQL中如何使用正則表達式(Regexp),希望對大家有所幫助。
  • python正則表達式使用方法說明
    曾光紅/文 (同步發布豆瓜網)一、導入re庫python使用正則表達式要導入re庫。import re在re庫中。正則表達式通常被用來檢索查找、替換那些符合某個模式(規則)的文本。二、使用正則表達式步驟1、尋找規律;2、使用正則符號表示規律;3、提取信息,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。
  • 正則表達式的基礎知識和Python中的基本應用
    第八十一節:正則表達式正則表達式又叫「規則表達式」(Regular Expression),簡稱RE,是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。
  • Python:正則表達式基本符號總結
    字符串是我們在編程的時候很常用的一種數據類型,檢查會在字符串裡面查找一些內容,對於比較簡單的查找,字符串裡面就有一些內置的方法可以處理,對於比較複雜的字符串查找,或者是有一些內容經常變化的字符串裡面查找,那麼字符串內置的查找方法已經不好使了,滿足不了我們的要求,這個時候就得用正則表達式了,正則表達式就是用來匹配一些比較複雜的字符串。
  • 學習Python正則表達式
    Python中的正則表達式(re)就可以解決這個問題!正則表達式正則表達式是一個具有特殊字符的序列。它有助於檢查字符串中的每個字符,看它是否與某個模式匹配:哪些字符在什麼位置出現了多少次。所以它不會一位數一位數地掃描數字,而是把整個拿走。『我只想得到電話號碼,不需要截取其他數字。』好吧,沒問題。讓我們看看如何知道111–1234567是一個電話號碼。因為它的區號是3位數,連接符是「-」,然後是7位數。
  • Python正則表達式:特殊符號和字符
    正表達式為高級的文本模式匹配,抽取,與/或文本形式的搜索和替換功能提供了基礎。簡而言之,正則表達式(簡稱regex)是由一些字符和特殊符號組成的字符串,它描述了模式的重複或者表達多個字符。python通過標準庫中的re模塊來支持正則表達式。
  • Python正則表達式由淺入深(二)
    在前兩篇連載文章中,我們學習了re模塊的match()、search()、findall()方法,以及學習了使用正則表達式中常用的元字符、限定符、選擇字符、中括號來搭配這些方法來靈活處理常見的數據匹配問題。這本篇文章分鐘,我們將會進一步學習正則表達式中其他符合,包括令初學者非常頭疼的分組問題。
  • 正則表達式 – 匹配規則
    正則表達式 - 匹配規則基本模式匹配一切從最基本的開始。模式,是正規表達式最基本的元素,它們是一組描述字符串特徵的字符。模式可以很簡單,由普通的字符串組成,也可以非常複雜,往往用特殊的字符表示一個範圍內的字符、重複出現,或表示上下文。