20. PoweShell - 正则表达式

·         PowerShell 正则表达式:三大类元素

字符:一个单独字符,或一个字符集合构成的字符串;

限定符:允许你在模式中决定字符或者字符串出现的频率;

定位符:允许你决定模式是否是一个独立的单词,或者出现的位置必须在句子的开头还是结尾;


元素


描述


.


匹配除了换行符意外的任意字符


[^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}


匹配上一个元素n至m次


{n}


匹配上一个元素n次


+


匹配上一个元素一次或者多次

·         PowerShell 正则表达式:四种不同模式

文字字符:”abc”确切的匹配”abc”字符串

转义字符:识别特殊字符如反斜杠,中括号,小括号;如”\[abc\]”可以识别”abc”

预定义字符:类似占位符,可以识别某一类字符,如”\d”可以识别0-9数字

自定义通配符: 包含在中括号中的通配符,如”[a-d]”可以识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使用”[^a-d]”

·         PowerShell 正则表达式:同时搜索不同的词语

1.       使用限定符“?”来标记这些词语作为可选字符。非常简单,把“?”放在可选字符后面即可。这样“?”前的字符就变成了可选字符,而不是非得出现。

"color" -match "colou?r"

True

"colour" -match "colou?r"

True

2.       如果你想标记更多的连续字符作为可选,可以把这些字符放置圆括号中建立子表达式。下面的子表达可以同时识别“Nov”和“November”:

"Nov" -match "\bNov(ember)?\b"

True

"November" -match "\bNov(ember)?\b"

True

3.       如果你想使用多个可选的搜索词语,可以使用“或”操作符“|”:

"Bob and Ted" -match "Alice|Bob"

True

4.       如果你想将搜索的词语和固定文本结合在一起,作为可选,仍然可以使用子表达式:

"Peter and Bob" -match "and (Bob|Willy)"

True

# 没有搜索到 "and Bob":

"Bob and Peter" -match "and (Bob|Willy)"

False

·         PowerShell 正则表达式:大小写敏感

# -match 大小写不敏感:

"hello" -match "heLLO"

True

# -cmatch 大小写敏感:

"hello" -cmatch "heLLO"

False

#使用.NET FrameWork的对象RegEx, 来自动的在大小写敏感与不敏感之间切换

PS > [regex]::matches("test", "TEST", "IgnoreCase")

Groups   : {test}

Success  : True

Captures : {test}

Index    : 0

Length   : 4

Value    : test

·         PowerShell 正则表达式:删除多余的空格

#使用正则表达式可以完成一些日常任务,比如一处一个字符串中多余的白空格。模式需要描述一个空格(字符:“\s”)至少出现两次(限定符:“{2,}”)。然后以一个正常的单空格字符替换。

实例:

"太多    太多的   空格怎么才能减少 " -replace "\s{2,}" ," "

# 太多太多的空格怎么才能减少

·         PowerShell 正则表达式:搜索和移除重复的单词

#怎样才能移除文本中多余的单词。这里,仍旧可以再次使用空格。模式可以这样定义:  “\b(\w+)(\s+\1){1,}\b”

模式会搜索一个单词(以“\b”定位),它由一个单词组成(字符“\w” 和限定符“+”),白空格紧随以后(字符“\s”和限定符“?”)。该模式中,白空格字符和将要被替换的单词必须至少出现一次(至少一次或者更多次,使用限定符“{1,}”)。整个模式会被第一次出现的反向引用给替换掉,也就是位于第一个的单词。

实例:

"太多太多的话我还没有说,太多太多太多的理由值得你留下" -replace "\b(\w+)(\s+\1){1,}\b", ‘$1‘

#太多的话我还没有说,太多的理由值得你留下

·         PowerShell 正则表达式:非捕获组

(expression) 是一种简单的子表达式
(?:expression)  是一种特殊的子表达式
后者不会将子表达式的匹配结果加入组中

#示例一

PS> ‘PSTips Net‘ -match ‘PS(Tips)\b‘

True

PS> $Matches

Name                           Value

----                           -----

1                              Tips

0                              PSTips

#示例二

PS> ‘PSTips Net‘ -match ‘PS(?:Tips)\b‘

True

PS> $Matches

Name                           Value

----                           -----

0                              PSTips

·         PowerShell 正则表达式:在文本行的开始插入字符

# “替换串”可以由多行文本中的多个实例组成。例如,在你平时回复一封邮件时,你可能在新邮件中会通过在行首添加 “>” 符号来引用原邮件的中的内容。正则表达式就可以做这样的标记。

然而,要完成它,你可能得稍微了解一点“多行”模式。通常,该模式是关闭的,此时限定符”^”代表文本的开始,”$”代表文本的结束。要让这两个限定符可以代表文本行的开始和文本行的结束,必须使用”(?m)”来开启“多行”模式。只有这样,–replace 才会在每个单独的文本行之间替换模式。在“多行”模式开启后,限定符”^” 和 “\A”,还有”$” and “\Z”会顿时拥有不同的表现。

”\A”仍然会标志文本的开始,而”^”则会标志文本行的开始。”\Z”仍然会标志文本的结尾,而”$”则会标志文本行结尾。

$text = @"

这是一段文本,

我想在回复的邮件中引用它,

所以我在每行的开始追加了">" 符号。

"@ 

结果:

这是一段文本,

我想在回复的邮件中引用它,

所以我在每行的开始追加了">" 符号。

# 通常, -replace 没有工作在多行模式.

# 鉴于此,只有第一行的开始被替换了:

$text -replace "^", "> "

结果:

> 这是一段文本,

我想在回复的邮件中引用它,

所以我在每行的开始追加了">" 符号。

# 如果你开启了多行模式, 替换串则会多行文本中起作用:

$text -replace "(?m)^", "> "

结果:

> 这是一段文本,

> 我想在回复的邮件中引用它,

> 所以我在每行的开始追加了">" 符号。

# 你也可以使用RegEx对象来完成多行替换,

# 不过得显式指定多行模式

[regex]::Replace($text,"^",">",[System.Text.RegularExpressions.RegexOptions]::Multiline)

结果:

> 这是一段文本,

> 我想在回复的邮件中引用它,

> 所以我在每行的开始追加了">" 符号。

# 在多行模式中 \A 仍旧代表文本的开始,^代表行的开始

# 这就是为什么下面的方法只能替换第一行的开始

[regex]::Replace($text,"\A",">",[System.Text.RegularExpressions.RegexOptions]::Multiline)

结果:

> 这是一段文本,

我想在回复的邮件中引用它,

所以我在每行的开始追加了">" 符号。

·         PowerShell 正则表达式:替换字符串

#实例一:-replace操作符, 用来替换字符串中的字串

"Hello, PowerShell" -replace "PowerShell", "www.pstips.net"

#Hello, www.pstips.net

#实例二:-replace操作符, 用来将多个类似的词语替换成同一个词语;

"Mr. Miller and Mrs. Meyer" -replace "(Mr.|Mrs.)", "Our client"

# Our client Miller and Our client. Meyer

备注:你可以在括号中输入任意的词语,多个词语之间用“|”隔开,这样所有的词语都会被指定的字符串替换掉。

·         PowerShell 正则表达式:搜索字符串片段

#举一个例子演示怎样通过正则表达式轻松的搜索字符串片段。下面的的脚本会匹配位于两个特定单词中的字串,并且字符的长度介于1到6之间。

"Find word segments from start to end" -match "\bstart\W+(?:\w+\W+){1,6}?end\b"

# True

$matches[0]

# start to end

"Find word segments from start to a  b c d e f g end" -match "\bstart\W+(?:\w+\W+){1,6}?end\b"

# False

$matches[0]

# start to end

·         PowerShell 正则表达式:贪婪与非贪婪匹配

实例一:默认,正则表达式属于“贪婪”模式。在搜索到Feb后会继续贪婪地搜索更多符合模式的的字符。如果可以整个文本会返回。

"Feb" -match "Feb(ruary)?"

#True

$matches[0]

#Feb

"February" -match "Feb(ruary)?"

#True

$matches[0]

#February

实例二:“??”限定符做的,它会将正则表达式转换成“非贪婪”模式,一旦他识别到一个模式,就会立即返回,不再会检查可选的子表达式是否匹配。

"Feb" -match "Feb(ruary)??"

#True

$matches[0]

#Feb

"February" -match "Feb(ruary)??"

#True

$matches[0]

#Feb

参考: http://www.pstips.net/powershell-online-tutorials/

时间: 2024-08-09 18:37:20

20. PoweShell - 正则表达式的相关文章

知道这20个正则表达式,能让你少写1,000行代码[转载]

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date

知道这 20 个正则表达式,能让你少写 1,000 行代码

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date

javascript 20个正则表达式

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date

20个正则表达式,减少千行代码

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date

转 知道这20个正则表达式,能让你少写1,000行代码

转 :链接:http://www.jianshu.com/p/e7bb97218946 正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r = fi

知道这20个正则表达式 能让你少写1,000行代码

正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升.下面是@技匠 整理的,在前端开发中经常使用到的20个正则表达式. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/; var r = fieldValue.match(re

[转帖]知道这20个正则表达式,能让你少写1,000行代码

知道这20个正则表达式,能让你少写1,000行代码 https://zhuanlan.zhihu.com/p/29163295 一直说要学习 正则 一直没学习.. 正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\\d{1,4})(-|\\/

前端开发中经常使用到的20个正则表达式

1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间. ^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 2. 校验中文 字符串仅能是中文. ^[\\u4e00-\\u9fa5]{0,}$ 3. 由数字.26个英文字母或下划线组成的字符串 ^\\w+$ 4. 校验E-Mail 地址 同密码一样,下面是E-mail地址合规性的正则检查语句. [\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$

20个正则表达式

正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的JavaScript代码: var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/; var r = fieldValue.match(reg); if(r==null)alert('Date format error!'); 1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间. ^(?=.\d)(?=.[a-z])(?=.*[A