【问题标题】:Quoting -replace & variables引用 -replace & 变量
【发布时间】:2012-03-14 10:13:40
【问题描述】:

这是对我之前的问题的回应:

PowerShell: -replace, regex and ($) dollar sign woes

我的问题是:为什么这两行代码有不同的输出:

'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"

根据下面的 2 篇文章,为什么单引号中的变量 '$1' 不被用作文字字符串?单引号中的所有内容都应该被视为文字字符串,对吧?

http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx

【问题讨论】:

    标签: variables powershell replace quotes


    【解决方案1】:

    这是 powershell 7 版本,您不必处理单引号 $1,将脚本块作为第二个参数,将 'ab' 替换为 'b':

    'abc' -replace 'a(\w)', {$_.groups[1]}
    
    bc
    

    【讨论】:

      【解决方案2】:

      由于我无法发表评论或投票,David Rogers 的回答对我有用。我需要在 RexEx 替换中同时使用 RegEx 反向引用和 Powershell 变量。

      在实现它之前,我需要了解反引号的作用,解释如下:反引号是 Powershell 的转义字符。

      我的用例

      $new = "AAA"
      "REPORT.TEST998.TXT" -Replace '^([^.]+)\.([^.]+)([^.]{3})\.', "`$1.`$2$new."
      

      结果

      REPORT.TESTAAA.TXT
      

      替代品

      格式化字符串

      "REPORT.TEST998.TXT" -Replace '^([^.]+)\.([^.]+)([^.]{3})\.', ('$1.$2{0}.' -f )
      

      评论

      根据https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html,我可能会使用格式字符串方法来避免使用反引号。

      【讨论】:

        【解决方案3】:

        在你的第二行:

        'abc' -替换'a(\w)', "$1"

        正如其他人所说,Powershell 在进行正则表达式替换操作之前替换了 $1。您可以通过使用反引号来避免这种替换,如下所示:

        'abc' -替换'a(\w)', "`$1"

        因此,如果您想在替换字符串中包含变量 $prefix 中的字符串,则可以在双引号中使用它,如下所示:

        'abc' -replace 'a(\w)', "$prefix`$1"

        【讨论】:

          【解决方案4】:

          当您使用单引号时,您告诉 PowerShell 使用字符串字面量,这意味着开始和结束引号之间的所有内容都将按字面意思解释。

          当您使用双引号时,PowerShell 将解释双引号内的特定字符。

          查看get-help about_quoting_rules 或点击here

          美元符号在正则表达式和 PowerShell 中具有特殊含义。如果您打算将美元符号用作正则表达式,则需要使用单引号。

          在您的示例中,正则表达式a(\w) 匹配字母“a”,然后匹配反向引用#1 中捕获的单词字符。因此,当您替换为$1 时,您正在将匹配的文本ab 替换为反向引用匹配b。所以你得到bc

          在使用双引号的第二个示例中,PowerShell 将 "$1" 解释为内部带有变量 $1 的字符串。您没有名为 $1 的变量,因此它为空。所以正则表达式用 null 替换了ab,这就是为什么你只会得到c

          【讨论】:

            【解决方案5】:

            “$1”是一个正则表达式反向引用。它由正则表达式匹配创建,并且仅存在于该替换操作的上下文中。它不是 powershell 变量。

            "$1" 将被解释为 Powershell 变量。如果不存在名为 $1 的变量,则替换值为 null。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-07-28
              • 1970-01-01
              • 1970-01-01
              • 2014-02-11
              • 2022-12-10
              • 2016-11-09
              • 2019-10-05
              • 2019-12-13
              相关资源
              最近更新 更多