正則表達式


  上文介紹了字符串常用的操作,其中替換、匹配等操作僅僅只能實現最簡單的功能,若要對字符串進行復雜的操作,比如:匹配出字符串中存在的IP地址、電話號碼等其他信息,字符串常用方法就不能實現了,若要解決復雜操作還需要正則表達式出馬。


一、通配符 

  使用正則表達式之前需要先學習一些常用的通配符,通配符就是正則表達式的語言。

*  匹配一個字符0次或多次
 ?  匹配一個字符一個字符 
匹配除了換行符以外的任意字符 
+ 匹配一個字符一次或多次
.* 匹配任意字符
 *? 匹配前面的元素0次或多次 
 {1,5} 匹配前面的字符1次到5次
 {3,} 匹配前面的字符3次以上 
 {2} 匹配前面的字符2次 
 $ 匹配以什么結尾 
 ^ 匹配以什么開始 
\d  匹配某個數字(0-9) 
 \D  匹配除數字以外的任意字符
\b 單詞邊界匹配 

二、使用

  1、字符串 -match使用正則進行匹配

    上一節提到了-match可以匹配一些字符是否包含在某個字符串中,這節我們利用正則來進行一波更6的操作。  

PS C:\Users\bill> $s = "my telephone number is 15162163126"

PS C:\Users\bill> $s -match "(.*)? (\d+)"
True

PS C:\Users\bill> $Matches

Name                           Value                                                                          
----                           -----                                                                          
2                              15162163126                                                                    
1                              my telephone number is                                                         
0                              my telephone number is 15162163126                                             

PS C:\Users\bill> $Matches[2]
15162163126

    若要提取某個字符串中的電話號碼,可以參照以上正則表達式來匹配。

       解釋:"(.*)? (\d+)",括號()代表的是一部分內容,按照順序依次為第一部分、第二部分......

           (.*)? 代表了任意字符,“.*”可以匹配的范圍小到空字符,大到整個字符串,“?”表示開啟貪婪匹配,貪婪匹配的意思是.*可以匹配整個字符串,若與?連用,那么.*的匹配范圍會盡可能的減小,上例中(.*)? 就匹配了“my telephone number is”。

       中間有個空格,目的是為了匹配“is”后的空格,可以幫助指定(.*)?的范圍。

        (\d+)作用是匹配一個以上的數字。

    $Matches可以看到匹配的所有結果,$Matches[2]的結果就是要匹配的電話號碼。

  再舉個例子,匹配出字符串中的url

PS C:\Users\bill> $s -match "<(.*)>http://(.*)</\1>"
True

PS C:\Users\bill> $Matches

Name                           Value                                                                          
----                           -----                                                                          
2                              www.abc.com                                                                    
1                              url                                                                            
0                              <url>http://www.abc.com</url>                                                  

PS C:\Users\bill> $Matches[2]
www.abc.com

  上面的例子中包一個知識點:

    “\1”的作用代表了第一個()中的正則表達式,便於書寫!

  2、-replace擴展

    字符串替換同樣已經在上一節中提到過,但也是基本操作,這節結合正則來接介紹一下它的更高級用法。

    組合替換:

PS C:\> $s = "ab ac ad ae bc bb bc bd ca cb cc cd" -replace "(a|b|c)(a|b|c)" ,"1"

PS C:\> $s
1 1 ad ae 1 1 1 bd 1 1 1 cd

     (a|b|c)代表'a' 'b' 'c'中任意一個字符,同后面的任意一個字符組合

    多行模式:

    一般遇到多行字符串,若要處理每行字符串就會束手無策,下面的例子本意是要給每行字符串前插入“|”符,但是沒有開啟多行模式就只能在第一行插入。

PS C:\> $a = @"
123
abc
xxx
ooo
yyy
"@

PS C:\> $a -replace "^","|"
|123
abc
xxx
ooo
yyy

    開啟多行模式去操作,只需添加"(?m)"即可實現對每行進行操作。

PS C:\> $a -replace "(?m)^","|"
|123
|abc
|xxx
|ooo
|yyy

  3、貪婪匹配

    上面已經提到了貪婪匹配,看了下面兩個例子就會更清晰了

PS C:\> $s = "abbbbbbbbbbbbbbbbbc"

PS C:\> $s -match ".*b"
True

PS C:\> $Matches

Name                           Value                                                                          
----                           -----                                                                          
0                              abbbbbbbbbbbbbbbbb  

  可以看到,不關閉貪婪匹配的情況下,會盡可能多的匹配滿足條件的字符,現在開啟貪婪匹配看下結果

PS C:\> $s -match ".*?b"
True

PS C:\> $Matches

Name                           Value                                                                          
----                           -----                                                                          
0                              ab  

  4、常用的正則表達式

    下面提供一些常用的正則表達式

    a、驗證用戶名密碼(以字母開頭、長度在6-18位、只能包含數字、字符和下划線)    

“^[a-zA-Z]w{5,17}$”

    b、URL路徑

^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$

    c、身份證號

“^d{15}|d{}18$”

    d、email地址

“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 
或者
"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$"

    e、手機號碼

 “^((d{3,4})|d{3,4}-)?d{7,8}$” 

    f、首尾行為空

"(^\s*)|(\s*$)"

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM