正则表达式
上文介绍了字符串常用的操作,其中替换、匹配等操作仅仅只能实现最简单的功能,若要对字符串进行复杂的操作,比如:匹配出字符串中存在的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*$)"