【问题标题】:-replace replaces RegEx group with its name-replace 用它的名字替换 RegEx 组
【发布时间】:2019-01-10 15:19:53
【问题描述】:

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

$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 上。使用我的计算机上的远程桌面也失败了。

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

设置:

  • 地点:美国
  • 语言:英语(美国)
  • 键盘布局:PLP

具体设置:

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

我知道这似乎没有连接,但我根本不知道。

编辑2:

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

【问题讨论】:

  • 我声明了$json = 'url = "http://localhost"' 并使用了你的代码。我确实得到了正确的结果,而且没有 3 美元。
  • ` 是转义字符。所以$3 将被视为字符串而不是变量。您需要转义转义字符,这样它就不会转义$。 (我在这里转义为代码而不是文本)
  • @T-Me - 已编辑,谢谢
  • @SagePourpre 请查找编辑说明。如有任何帮助,我将不胜感激。
  • 你为什么要用正则表达式来解析json?

标签: regex powershell


【解决方案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"

【讨论】:

  • 请查找edit2 - 反向引用和大括号都不能解决RegEx组之后的数字问题。你知道如何解决它吗?如有任何帮助,我将不胜感激。
  • 首先替换 ${vars} 接受者,因此这将解析为 $31.2.3.4,它被解释为不存在的 $31。解决方案是将数字三括在大括号/大括号中。查看更改后的答案。
  • 谢谢 - 我想这样做但我忘记了 ` ` ` 字符因此结果是http1.2.3.4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2023-03-11
相关资源
最近更新 更多