我对以下替换语句确实有一个理解上的问题。
'Select {0}' -replace '[^\\](\{0\})', 'Success'
我希望:选择成功
相反,结果是: SelectSuccess
可以通过以下方式解构'[^\\](\{0\})'
模式:
如果我确实删除了不部分[^\\]
。然后结果再次变为选择成功
我想念什么吗?
答案 0 :(得分:2)
编者注:此答案显示了PowerShell中可用的常规字符串格式设置技术,但是在OP的特定情况下,它不是一种选择,因为需要有条件的字符串替换。 / sup>
您是否知道-f
的运算符。 PowerShell可以像.net一样进行字符串格式化。
示例:-
'Select {0}' -f 'Success'
'Select {0} {1}' -f 'All','Files'
请参阅下面的文章以了解其如何在.Net中完成,也可以使用-f
https://docs.microsoft.com/en-us/dotnet/api/system.string.format?view=netframework-4.7.2#examples
答案 1 :(得分:2)
正如LotPings在评论中指出的那样,问题在于[^\\]
与{0}
之前的空格字符匹配,因此要替换的完全匹配项为 {0}
,解释了为什么结果是SelectSuccess
。
解决方案是使用negative look-behind assertion:
Select {0}' -replace '(?<!\\)\{0\}', 'Success'
(?<!\\)
确保子表达式\{0\}
后面没有(!
)(?<...
字符。 (\
)不包含该字符。在比赛中。
LotPings也指出,在正则表达式中使用捕获组(\\
)无效,因为您都没有将其称为正则表达式((...)
)中的反向引用。本身或替换操作数(\1
)中。
请注意,$1
始终替换正则表达式捕获整体的内容,而与捕获组无关。要匹配输入的一部分而不将其包括在捕获的结果中,请使用look-around assertions,如上所示。
答案 2 :(得分:1)
您想做两件事:
{0}
前面可能有{
表示文字反斜杠,请查找并非以转义的\\
开头的{
(使用{{1} } regex并替换为(?<=(?<!\\)(?:\\{2})*)\{0\}
)Success
正则表达式并替换为(?s)\\(.)
)使用
$1
模式1详细信息
'Select \\\{0}' -replace '(?<=(?<!\\)(?:\\{2})*)\{0\}', 'Success' -replace '(?s)\\(.)', '$1'
-当前位置左侧紧随其后的正向要求
(?<=(?<!\\)(?:\\{2})*)
-当前位置左侧不允许(?<!\\)
\
-两次反斜杠的重复次数为0或更多(?:\\{2})*
-一个\{0\}
字符串。请参见regex demo。
模式2详细信息
{0}
-一个(?s)
选项,使RegexOptions.Singleline
能够匹配换行符.
-文字反斜杠\\
-捕获第1组:任何字符(替换了匹配项后,它将被放回到结果字符串中)。请参见this regex demo。