首页 > 解决方案 > 替换参数剥离它不应该的空间

问题描述

我对以下替换语句确实有理解问题。

'Select {0}' -replace '[^\\](\{0\})', 'Success'

我希望:选择成功

相反,结果是:SelectSuccess

'[^\\](\{0\})'模式可以通过以下方式解构:

如果我删除Not部分[^\\]。然后结果再次变为选择成功

我错过了什么吗?

标签: regexpowershell

解决方案


正如LotPings在评论中指出的那样,问题在于[^\\]匹配之前的空格字符{0},因此被替换的完整匹配是 {0},这就解释了为什么结果是SelectSuccess

解决方案是使用否定的后视断言

Select {0}' -replace '(?<!\\)\{0\}', 'Success'

(?<!\\)确保子表达式\{0\}不是 ( !) 前面有 ( (?<...) 一个\字符。( \\)不包括该字符。在比赛中

正如 LotPings 还指出的那样,您(...)在正则表达式中使用捕获组 ( ) 没有任何效果,因为您既没有将其称为正则表达式 ( \1) 本身内部的反向引用,也没有在替换操作数 ( $1) 中引用它。

请注意,无论捕获组如何,它-replace总是替换正则表达式整体捕获的内容。要匹配部分输入而不将它们包含在捕获的结果中,请使用环视断言,如上所示。


推荐阅读