PowerShell正则表达式(一) 定义模式 7


如果你需要更加精确的模式识别需要使用正则表达式。正则表达式提供了更加丰富的通配符。正因为如此,它可以更加详细的描述模式,正则表达式也因此稍显复杂。 使用下面的表格中列出的正则表达式元素,你可以非常精准的描述模式。这些正则表达式元素可以归为三大类。
字符:字符可以代表一个单独的字符,或者一个字符集合构成的字符串。
限定符:允许你在模式中决定字符或者字符串出现的频率。
定位符:允许你决定模式是否是一个独立的单词,或者出现的位置必须在句子的开头还是结尾。

正则表达式代表的模式一般由四种不同类型的字符构成。
文字字符:像”abc”确切地匹配”abc“字符串
转义字符:一些特殊的字符例如反斜杠,中括号,小括号在正则表达式中居于特殊的意义,所以如果要专门识别这些特殊字符需要转义字符反斜杠。就像”\[abc\]”可以识别”[abc]”。
预定义字符:这类字符类似占位符可以识别某一类字符。例如”\d”可以识别0-9的数字。
自定义通配符:包含在中括号中的通配符。例如”[a-d]”识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使用”[^a-d]”。

元素 描述
. 匹配除了换行符意外的任意字符
[^abc] 匹配除了包含在中括号的任意字符
[^a-z] 匹配除了包含在中括号指定区间字符的任意字符
[abc] 匹配括号中指定的任意一个字符
[a-z] 匹配括号中指定的任意区间中的任意一个字符
\a 响铃字符(ASCII 7
\c or \C 匹配ASCII 中的控制字符,例如Ctrl+C
\d 匹配数字字符,等同于[0-9]
\D 匹配数字以外的字符
\e Esc (ASCII 9)
\f 换页符(ASCII 15)
\n 换行符
\r 回车符
\s 白空格(空格,制表符,新行)
\S 匹配白空格(空格,制表符,新行)意外的字符
\t 制表符
\uFFFF 匹配Unicode字符的十六进制代码FFFF。例如,欧元符号的代码20AC
\v 匹配纵向制表符(ASCII 11)
\w 匹配字符,数字和下划线
\W 匹配匹配字符,数字和下划线意外的字符
\xnn 匹配特殊字符,nn代表十六进制的ASCII
.* 匹配任意数量的字符(包括0个字符)

 

限定符

上面表格中列出的每个通配符,可以代表一个确定的字符。使用限定符,可以精确地确定字符的出现频率。例如”\d{1,3}”代表一个数字字符出现1到3次。

元素 描述
* 匹配一个元素0次或者多次(最大限度地匹配)
*? 匹配前面的元素零次或者多次(最小限度地匹配)
.* 匹配任意个数的任意字符(包括0个字符)
? 匹配上一个元素0次或者1次(最大限度地匹配)
?? 匹配上一个元素0次或者1次(最小限度地匹配)
{n,} 匹配上一个元素至少n
{n,m} 匹配上一个元素nm
{n} 匹配上一个元素n
+ 匹配上一个元素一次或者多次

识别IP地址

类似IP地址的模式通过正则表达式来描述比简单的通配符字符会更加精确。通常会使用字符和量词结合,来指定某个具体的字符应当出现,以及出现的频率:

元素 描述
$ 在字符串的结尾匹配
\A 在字符串的开始匹配(包含多行文本)
\b 在单词的边界匹配
\B 不在单词的边界匹配
\Z 在字符串的结尾匹配(包含多行文本)
^ 在字符串的开始匹配

 

$parttern="\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
"192.168.10.3" -match $parttern
"a.168.10.3" -match $parttern
"1000.168.10.3" -match $parttern
<#
 #输出
 #True
 #False
 #False
#>

这里模式被描述成4个类似的数字,每个数字以圆句句号分割,每个数字的位数介于1-3。另外在开始和结尾可以包含空格。当这些数字处于0到255之间时,IP的验证还是挺完美的。
但是当某个数字超过255时,则显得无能为力。

$parttern="\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"
"255.489.921.321" -match $parttern
<#
 #输出:
 #True
#>

验证Email格式

如果你想验证用户提供的E-Mail地址是不是一个合法电子邮件格式,可以使用下面的正则表达式:

$parttern = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b"
"mosser@pstips.net" -match $parttern
".@ ." -match $parttern
<#
 #输出:
 #True
 #False
#>

无论什么时候,希望一个表达式以一个单独的“单词”在文本中出现,可以使用分隔符:单词边界(定位符”\b”),这样正则表达式就会知道你感兴趣的是字符串中除去那些白空格(像空格,制表符,换行符)以外的字符。

紧随其后的正则表达式指定的是那些字符可以被允许出现在电子邮件地址中。被允许的字符放在方括号中,由字符区间(例如:A-Z0-9″)和单个字符(例如:”._%+-“)构成。“+”放在方括号后面是一个限定符,意味着前面的字符至少出现一次。当然你可以规定出现更多的字符。
接下来的是“@”,@之后的字符可以和@前面的一样。在电子邮件地址后面必须出现一个圆句点。但是因为圆句点属于特殊字符,所以加了反斜杠转义,让它以普通字符的形式出现在正则表达式中。
在圆句点之后是域标识,它们完成由字母([A-Z])组成,限定符({2,4})紧随其后指定域标识符应当至少由2个字符,至多由4个字符组成。
但是上面的正则表达式仍旧有一些瑕疵:

$parttern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$"

"请邮件联系: mosser@pstips.net 好不好?" -match $parttern
"mosser@pstips.net" -match $parttern
<#
 #输出:
 #False
 #True
#>

原始英文链接:http://powershell.com/cs/blogs/ebookv2/archive/2012/03/20/chapter-13-text-and-regular-expressions.aspx

本文链接: https://www.pstips.net/regex-describing-patterns.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

回复 荔非苔 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注

7 条评论 “PowerShell正则表达式(一) 定义模式

  • CD

    $parttern=”bd{1,3}.d{1,3}.d{1,3}.d{1,3}b””192.168.10.3″ -match $parttern #true$parttern -match “192.168.10.3” #falseMooser Lee大哥,我想问一下-match前后的参数对调一下就会影响结果?觉得很奇怪,不知道能否给小弟解释一下?

  • CD

    $parttern = “b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b””mosse!r@pstips.net” -match $parttern #true 感叹号在中间为什么是true?是不是因为.的关系?匹配所有字符除了换行符,那么既然如此干嘛还要后面的下划线,百分号,中划线呢?”mosser_@pstips.net” -match $parttern #true 如果是下划线的话,不管在哪里都会是true的,这个我理解.”mosser!@pstips.net” -match $parttern #false 为什么感叹号在最后就false?希望lee帮忙解答下~谢谢

    • CD

      略有领悟:方括号中间的都只是普通的’字符’,不代表任何正则表达式里面的特定符合,点就是点,不表示除换行符之外的一切字符…不过还是有疑问,第一条的感叹号在中间为什么就是true?中括号里面可没有感叹号啊…

      • CD

        明白了,正则表达式是判断这个字串里面有无满足该表达式形式的字串,而不是用来判断这整个字串是否满足该表达式的!通过下面的例子就很清楚了:$parttern1 = “b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}b” $string = ‘moss!er@pstips.net’输出的$Matches.value = er@pstips.net