概述
一个正则表达式是一个用来匹配文本的串。不过这个串是代表的是一个具有特定特点的串。
可以使用正则表达式的情况:
命令: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
#一定要注意上面的结果.