我在使用powershell的文本中使用正则表达式,但只有当文本不包含回车时才有效。我准备了一个像这样的示例文件:
the duck is on the table --found!
the elephant is on the table --found!
the cat is
on the table --NOT found! :-(
the lion is on the tablet --NOT found but ok ;-)
the dog is on
the table --NOT found! :-(
the turtle isonthe table --NOT found but ok ;-)
the cow is on the table --found!
我想要case包含"on table",所以我执行这个:
select-string -path "c:example.txt" -pattern '([^w]{1})on([^w])+the([^w])+table([^w]{1})'
输出:
example.txt:1:鸭子在桌子上——找到了!
example.txt:2:大象在桌上——找到了!
example.txt:14:奶牛在桌子上——找到了!
但我也需要有回车的情况!猫在哪里?狗在哪里?
谢谢;-)
我不确定这是否可能使用Select-String
,因为它逐行而不是将文件读取为单个多行string
,但这对我有用:
$tmp = New-TemporaryFile
@'
the duck is on the table
the elephant is on the table
the cat is
on the table
the lion is on the tablet
the dog is on
the table
the turtle isonthe table
the cow is on the table
'@ | Set-Content $tmp
$content = Get-Content $tmp -Raw
[regex]::Matches($content, '.*[^w]on[^w]+the[^w]+table[^w].*') |
Select-Object Index,Value | Format-Table -Wrap
结果:
Index Value
----- -----
0 the duck is on the table
29 the elephant is on the table
62 the cat is
on the table
119 the dog is on
the table
175 the cow is on the table
如果你只想要单词之间的空格,最好使用:
'.*sons+thes+tables.*'
不区分大小写:
[regex]::Matches($content, '.*[^w]on[^w]+the[^w]+table[^w].*', [System.StringComparison]::OrdinalIgnoreCase)
通过Select-String
的-Path
或-LiteralPath
参数提供文件输入,逐行处理目标文件
为了跨行匹配模式,文件的内容必须作为单个多行字符串传递,这就是Get-Content
的-Raw
开关所做的.
另外,为了报告多行字符串中的多个匹配,必须使用Select-String
的-AllMatches
开关.
结果匹配然后可以通过Select-Object
输出的Microsoft.PowerShell.Commands.MatchInfo
实例的.Matches
属性进行处理:
Get-Content -Raw example.txt |
Select-String -AllMatches '(?m)^.*?sons+thes+tableb.*$' |
ForEach-Object {
foreach ($match in $_.Matches) {
"[$($match.Value)]"
}
}
[1]
关于上面使用的正则表达式的解释,请参见regex101.com页面。以上结果:
[the duck is on the table]
[the elephant is on the table]
[the cat is
on the table]
[the dog is on
the table]
[the cow is on the table]
[1]请注意,即使regex101.com,一个用于可视化、解释和实验正则表达式的站点,也不支持。. NET正则表达式引擎,选择类似的引擎,如Java的,通常表现出相同的行为,至少从根本上。