powershell正则表达式

这篇博客详细介绍了PowerShell中的正则表达式用法,包括如何进行匹配、替换和分组。重点讨论了特殊字符的跳脱、组构建、命名匹配以及-replace操作符的使用。内容涵盖匹配规则、注意事项以及在多行和单行模式下的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

一个正则表达式是一个用来匹配文本的串。不过这个串是代表的是一个具有特定特点的串。
可以使用正则表达式的情况:
命令:Select-String,
操作符:-match,-replace,-split,
-regex参数(可选的)。
默认的,powershell正则表达式不区分大小写。强制区分大小写的方式如下:

对象使之区分的参数
Select-String使用-CaseSensitive参数
可选参数(-regex)使用-CaseSensitive参数
操作符(-match,-replace)加前缀c(-cmatch,-csplit,-creplace)

实例

  • 直接匹配
'book' -match 'oo'  #输出True,即-match匹配结果是True/False
  • [],匹配[]里的任何一个字符。反之,[^abcd]匹配abcd外的任何一个字符
"abcd" -match '[b]' #True
"abcd" -match '[^abc]' #True
"abcd" -match '[^abcd]' #False
  • [a-z],[A-Z],[0-9],[ -~],分别匹配小写字母,大写字母,数字,可打印字符
42 -match '[0-9][0-9]' #True,匹配两个数字
  • \d匹配任何一个十进制数字(0-9)。相反,\D匹配任何一个非十进制数字。
'Server-01' -match 'Server-\d\d' #True
  • \w等效于匹配[a-zA-Z0-9],\W正好相反
'Book' -match '\w' #True
'**?' -match '\w' #False
  • .(一个点)匹配任何一个字符(\n除外)
'a1\ ' -match '....' #True
  • \s匹配一个空格,\S则相反
' - ' -match '\s- '  #True
  • *, +, ?, {n,m}和它们前面的那个字符形成一个组合,这几个符号分别表示前面这个字符出现>=0次,>=1次,0或1次,m~n次(至少n次,至多m次)
'ACCOUNT NAME:    Administrator' -match 'ACCOUNT NAME:\s*\w*' # \s*匹配0至多个空格。\w*匹配0到多个[a-zA-Z0-9],因此结果为True

'DC-01' -match '[A-Z]+-\d\d' #[A-Z]+ 匹配一个以上的大写字母。结果为True

'SERVER01' -match '[A-Z]+-?\d\d' #-?匹配-符号0到一次,所以结果为True

'111-222-3333' -match '\d{3,5}-\d{3}-\d{4,}' #\d{3,5}匹配数字3-5次,\d{3}刚好匹配数字三次,\d{4,}至少匹配数字4次。因此结果为True

'ab23 \ ?' -match '.*' #匹配不含\n的任何长度的组合

#因此,\w*匹配任意长度的数字字母组合。\d*匹配任意长度的数字组合。.*匹配任意长度的组合(不会\n)
  • ^和它后面的字符组合,匹配以此字符开始的串。$和其前面的串组合,匹配以此字符结尾的串。
'fishing' -match '^fish$' #True

注意:
1.正则表达式最好放在单引号里面。否则在双引号里若含有$符号,powershell将会把把其视作变量。

2.使用$和^符号时,要区分待匹配对象是单行还是多行:多行的文件$和^会匹配每行的结尾和开始。对单行的模式,.会匹配所有字符,包含\n。

跳脱字符

[] () . \ ^ $ | ? * + {} 这些字符在正则表达式里有特殊意义,要匹配这些字符时,前面加一个\即可。

'3.141' -match '3\.\d{2,}' #True

[regex]::escape('3.\*?^$$d{2,}') #该语法为正则表达式中特殊字符添加必要的\。结果为:3\.\\\*\?\^\$\$d\{2,}

#\t匹配一个tab键,\n匹配一个换行符,\r匹配一个回车键
# 作为正则表达式,'$$'中匹配$。

Groups, Captures, and Substitutions

组构建

组构建会把匹配对象分成几个字串。这些字串可以被抓取或者忽略掉。一个组构建式是一个由几个圆括号包围的正则表达式。

举例如下:

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
#(.+was )匹配The last logged on user was 。而(.+)匹配CONTOSO\jsmith。所有结果为True。
#使用$Matches 这个哈希表自动变量储存抓取的结果。整个文本储存在键0中。
$Matches.0 #输出:The last logged on user was CONTOSO\jsmith

$Matches
#输出如下
Name                           Value
----                           -----
2                              CONTOSO\jsmith
1                              The last logged on user was
0                              The last logged on user was CONTOSO\jsmith

可以看到:$Matches.0是整个文本,$Matches.1是匹配的第一部分,$Matches是匹配的第二部分(从左到右编号)

对匹配的结果命名

若要对匹配的各部分进行命名(存放在$Matches这个哈希表的一个键中),则需要在正则表达式中每个圆括号里添加“?<keyname>”这一部分。即指定一个键的名字。
如下例:

$string = 'The last logged on user was CONTOSO\jsmith'
$string -match 'was (?<domain>.+)\\(?<user>.+)'  #True:was (?<domain>.+)匹配was开始的一部分,但(?<domain>.+)匹配的是CONTOSO。\\匹配一个\。
#(?<user>.+)匹配jsmith。而?<domain>指明第一个圆括号匹配的结果存放在$Matches.domain中。?<user>指明第二个圆括号匹配的结果存放在$Matches.user中。

PS> $Matches

Name                           Value
----                           -----
domain                         CONTOSO
user                           jsmith
0                              was CONTOSO\jsmith

PS> $Matches.domain
CONTOSO

PS> $Matches.user
jsmith

替换

-replace操作符可以支持正则表达式替换。
基本语法:<input> -replace <original>, <substitute>
input:一个串
origin:一个针对输入串的正则表达式
substitue:用来替换原来串的的串

注意:-replace对应的含有多个圆括号的正则表达式,它匹配的各字串可以在substitue作为变量被引用。
引用方式用两种:数字方式和名字方式。
如下例:

#数字方式
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com' #结果:John.D.Smith@contoso.com。
#被分成三部分。分别存放在$1=John,$2=D,$3=Smith中。
echo $1 #无输出。说明$1,$2,$3只能被后面的替代串引用
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$&@contoso.com' 
#结果:John D. Smith@contoso.com。$&表示整个文本。


#名字方式
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}' #结果:FABRIKAM\Administrator.

-replace操作符和Replace()方法

1.Replace()方法对大小写敏感,-replace则不然
'HeElo World.'.Replace('e', 'x') #HxElo World.
'HeElo World.' -replace 'e','x' #Hxxlo World.
'HeElo World.' -creplace 'e','x' #HxElo World.-creplace则对大小写敏感。

2.Replace()方法不支持正则表达式,-replace则不然
'HeElo World.' -replace '.*','x' #xx
'333' -replace '.*','x' #xx
'333' -replace '..\d','x' #x
'333' -replace '(3)(.*)','x'#x
#一定要注意上面的结果.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值