【问题标题】:Why does powershell remove one of the '$' when replacing?为什么powershell在更换时会删除“$”之一?
【发布时间】:2013-09-16 05:40:47
【问题描述】:

对此我一直摸不着头脑,最终只使用了 String.Replace,但是,我想知道 Powershell 在做什么,谁能给我解释一下?

>"aaa" -replace "aaa", 'GG$$`~~'

结果:

GG$`~~

而不是

GG$$`~~

我的印象是单引号阻止了字符串中内容的扩展,这与正则表达式有关吗?如果我在每一美元和反引号之间添加一些东西,它会起作用,但这不是我想要的......

编辑:

似乎是多种事物的结合:

"aaa" -replace "aaa", '$$' --> "$"
"aaa" -replace "aaa", '$`' --> ""

我仍然不知道为什么要这样做

【问题讨论】:

标签: regex powershell


【解决方案1】:

在替换中$ 表示反向引用。

例如如果你使用:

"aaa" -replace "(aaa)", 'GG$1`~~'
GGaaa`~~

使用:

"aaa" -replace "(aaa)", 'GG$$1`~~'
GG$1`~~

所以,真正放置 $$ 意味着您放置的是文字 $ 字符。如果变量不存在...

"aaa" -replace "aaa", 'GG$`~~'
GG~~

shell 尝试查找变量 $`,但由于它不存在,因此您会得到一个空字符串。

所以,得到

GG$$`~~

你必须使用 4 $:

"aaa" -replace "(aaa)", 'GG$$$$`~~'
GG$$`~~

每一对$$ 表示一个字面值$

使用相同的逻辑...

"aaa" -replace "aaa", '$$' --> "$"
"aaa" -replace "aaa", '$`' --> "" //Because the variable $` doesn't exist, it's 'null'.

【讨论】:

  • 谢谢!那是我需要的关键信息...“反向引用”:) Google 在尝试搜索符号时并没有太大帮助。
【解决方案2】:

在普通正则表达式中,美元符号('$')表示字符串的结尾...

在上面的示例中,您在带有 $ 符号的字符串 之后 打勾,因此它不会转义处理该字符串: 根据这里:http://ss64.com/ps/syntax-esc.html

应该是:'GG`$~~'

【讨论】:

  • 但是我想要两个 $ 符号和结果中的反引号,也不是它匹配的模式,它的字符串是其中包含字符的替换,为什么该字符串是受限于正则表达式的“字符串结尾”功能?
  • 我猜是因为替换还可以包含一个正则表达式(标准),所以它只是经过与搜索字符串相同的处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多