上文介紹了字符串常用的操作,其中替換、匹配等操作僅僅只能實現最簡單的功能,若要對字符串進行復雜的操作,比如:匹配出字符串中存在的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*$)"
