在带有回车符的文本中使用正则表达式



我在使用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的,通常表现出相同的行为,至少从根本上。

相关内容

  • 没有找到相关文章

最新更新