替换参数,删除不应该删除的空格

时间:2019-03-31 05:32:07

标签: regex powershell

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

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

我希望:选择成功

相反,结果是: SelectSuccess

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

  • 匹配单个字符,不在列表'\'
  • 匹配内部模式并捕获其匹配项
    • 从字面上匹配字符'{'
    • 从字面上匹配字符“ 0”
    • 从字面上匹配字符'}'

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

我想念什么吗?

3 个答案:

答案 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\}
  • “ Unescape”所有转义字符,其中转义字符是文字​​反斜杠(使用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