【问题标题】:Regex to replace text after equals sign [duplicate]正则表达式替换等号后的文本[重复]
【发布时间】:2021-04-16 11:26:06
【问题描述】:

我正在尝试在 powershell 中使用正则表达式来逐行替换文本,但这会导致整行被替换为所需的值,但没有原始前导文本和不需要的美元符号。

带有要替换的行的示例文件:

server.ssl.keystore-password=ffdsfsa
server.ssl.key-password=ffdsaf

正则表达式示例:

KeyStorePassword='4Z9dwVQn6wSk5H3kWX2SsxGWhZ/jTUrwgDSyfYNCxN0='
'(server.ssl.key-password=).*',("`$1$KeyStorePassword")

但最终发生的事情是它替换了以下行:

$4Z9dwVQn6wSk5H3kWX2SsxGWhZ/jTUrwgDSyfYNCxN0=

当期望的结果是

server.ssl.key-password=4Z9dwVQn6wSk5H3kWX2SsxGWhZ/jTUrwgDSyfYNCxN0=

【问题讨论】:

标签: regex powershell


【解决方案1】:

这里的问题是当插入$KeyStorePassword 时,开始的数字(在这种情况下为4)被附加到$1 使得替换尝试使用捕获组14$14)而不是捕获组 1. 命名您的捕获组可以防止这种情况,或者在这种情况下使用 {} 包围您的捕获组名称。

# Using unnamed capture groups
'server.ssl.key-password=ffdsaf' -replace '(server\.ssl\.key-password=).*',"`${1}$KeyStorePassword"

在 PowerShell 中,命名的捕获组语法为 (?<Name>match text)。然后,您可以将捕获组结果替换为 ${Name}

# Using named capture groups
'server.ssl.key-password=ffdsaf' -replace '(?<field>server\.ssl\.key-password=).*',"`${field}$KeyStorePassword"

我们可以用一个更简单的例子来复制这个问题:

$ExtraNumber = 2
'98' -replace '(?<12>\d)(\d)',"`$1$ExtraNumber"
9

我们将第一个匹配命名为捕获组12。在替换中,$ExtraNumber 将被评估为 2,因此被替换的组将是 12 ($12)。

【讨论】:

  • 感谢您的详尽解释。所以我猜我遇到问题的唯一原因是我的替代品,所以碰巧从数字开始。
  • @jwhit265 是的,这就是原因。该问题被错误地关闭,您无缘无故被否决。不幸的是,我对此无能为力。
猜你喜欢
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多