-replace用名称替换RegEx组

时间:2019-01-10 15:19:53

标签: regex powershell

我有一个这样的替换语句:

$var1 = "http"
$var2 = "1.2.3.4"
$json = $json -replace '(url = ["''])(.*)(:\/\/)(.*)(["''])', "`$1$var1`$3$var2`$5"

应该原样保留在行下面:

url = "http://1.2.3.4"

更改为

url = "http$31.2.3.4"

据我了解,`$3应该替换为://,就像`$5"替换一样。

有没有我经常丢失的规则?

编辑:

我检查了多台计算机,这是我发现的内容:

  1. 相同的代码在其他计算机上正常运行(在Windows Server 2016和Windows 10上测试),
  2. 相同的代码在通过远程桌面(Windows Server 2016)连接的Azure VM上运行正常,
  3. 在我的计算机(Windows Server 2019)上,它按照描述失败了,
  4. 在与第2点相同的VM上。使用我的计算机上的Remote Desktop也会失败。

现在我真的不知道发生了什么。也许与语言环境有关?

设置:

  • 位置:美国
  • 语言:英语(美国)
  • 键盘布局:PLP

特定设置:

  • 数字格式:-123,456,789.00
  • 一周的第一天:星期一
  • 时间格式:HH:mm:ss
  • 日期格式:yyyy-mm-dd

我知道这似乎没有联系,但我一点也不知道。

编辑2:

当RegEx组后的第一个字符(甚至转义)是一个数字(甚至作为变量)时,似乎RegEx不能按预期工作。但是仍然不知道如何省略它。

1 个答案:

答案 0 :(得分:1)

  • 为了与引号完全匹配,我建议使用带有嵌套组的backreference
  • 要将变量插入替换字符串中,请将该名称括在大括号中
  • 斜杠不需要转义。
  • 要在替换项中插入一个捕获组(编号$1),该捕获组可能会干扰以下文本,请将其也括在${1}大括号中

## Q:\Test\2019\01\10\SO_54131783.ps1

$json = 'url = "http://localhost"'

$var1 = "http"
$var2  = "1.2.3.4"

$json = $json -replace '(url = (["''])).*?(://).*?(\2)',
                       "`${1}${var1}`${3}${var2}`${2}"
$json

url = "http://1.2.3.4"