powershell中的正则表达式

Posted Mr.Zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了powershell中的正则表达式相关的知识,希望对你有一定的参考价值。

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

  

 

 

以上是关于powershell中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 PowerShell 中的正则表达式匹配的每个实例之后附加字符

复杂的正则表达式 - 在Powershell中工作,而不是在Bash中工作

可以在这个 PowerShell 脚本中使用正则表达式吗?

用powershell中的regex替换子字符串

通过 Java 正则表达式提取 semver 版本字符串的片段

powershell 阅读INI文件/正则表达式