简单的问题:为什么
"x" -replace ".*", "y"
产生“yy”?
答案 0 :(得分:8)
"x" -replace ".*", "y"
相当于
[Regex]::replace("x",".*","y")
根据MSDN,您看到的结果yy
取决于其工作原理:
在指定的输入字符串中,替换匹配a的所有字符串 使用指定的替换字符串指定正则表达式。
http://msdn.microsoft.com/en-us/library/e7f5w83z.aspx
替换将找到与正则表达式匹配的字符串,并将其替换为给定的替换。因此,x替换为y,然后空字符串替换为y,您得到yy
。
这可以通过[Regex]::matches("x",".*")
来验证 - 它提供两个匹配 - 一个用于空字符串,一个用于x。
就其他正则表达式引擎而言,这是因为g
或全局标志。
这也可以在Python中验证如下(只是为了表明这不仅限于Powershell / .Net):
>>> re.findall(".*","x")
['x', '']
答案 1 :(得分:4)
因为你匹配两次,*
首先匹配整个字符串,因为它是贪婪的。然后它什么都不匹配。感谢@Tim的评论。
您应该使用的是.+
。