给定foo.txt
this is a file
it has some text
the text has three lines
以下正则表达式替换
(get-content -raw foo.txt) -replace ".*", "hello" | write-output
产生输出
hellohello
hellohello
hellohello
而不是所需的
hello
我的理解是get-content
将内容作为字符串数组返回,每行一个。 -raw
标志将内容作为单个字符串返回,从而取代了此行为。据我所知,".*"
应匹配整个字符串,但它在每一行匹配两次。
请告知。
答案 0 :(得分:2)
使用内联(?s)
( dotall )修饰符强制.
跨越换行符。
(Get-Content .\foo.txt -Raw) -replace "(?s).+", "hello"
示例:强>
PS> $data = Get-Content .\foo.txt -Raw
PS> $data
this is a file
it has some text
the text has three lines
PS> $data -replace "(?s).+", "hello"
hello
答案 1 :(得分:1)
除了说.
似乎不匹配换行符之外,我无法解释它,因此每个完整行匹配一个匹配,然后匹配每行末尾的零个字符。< / p>
这也解释了.+
每行一次的hello
行为。
您可以使用与换行符匹配的更好模式来“修复”此问题。
(Get-Content -raw .\foo.txt) -replace "(.|\r|\n)+", "hello"
答案 2 :(得分:0)
来自https://stackoverflow.com/a/13674250/1252649,
DotAll模式的诀窍是使用
[\s\S]
而不是.
。此角色类匹配任何角色......
当然,这提出了一个问题:.
究竟应该与“任何角色”匹配。