regex - 使用 Powershell 替换捕获的值
问题描述
我想使用 PowerShell 替换 XML 中的值。我有以下字符串(XML 的一部分)想用不同的值替换 100
<stringProp 79357name="ThreadGroup.79357num_threads">100</stringProp>
我尝试了下面的代码来识别所需的值,但是在替换它时替换所有的数值
$DN = '<stringProp 79357name="ThreadGroup.79357num_threads">100</stringProp>'
$test =10000
[regex]$rx='^ThreadGroup.79357num_threads">(.+?)</stringProp>$'
$rx.Match($DN)
$DN = $rx.Replace($DN,'$1') -replace '\d+',$test
Write-Host $DN
运行上面的代码后,我得到低于输出
<stringProp 10000name="ThreadGroup.10000num_threads">10000</stringProp>
我期待着
<stringProp name="ThreadGroup.10000num_threads">10000</stringProp>
解决方案
当我们需要匹配特定上下文中的模式匹配时,正则表达式中使用捕获组来提取模式匹配的一部分。不直接支持替换捕获的文本,但可以通过一些编码来解决它。
相反,使用捕获组来做他们应该做的事情:捕获您需要保留的内容并匹配您需要替换的内容。
利用
$DN -replace '(ThreadGroup\.79357num_threads">).*?(</stringProp>)',"`${1}$test`$2"
被ThreadGroup.79357num_threads">
捕获(ThreadGroup\.79357num_threads">)
到第 1 组,</stringProp>
并被捕获(</stringProp>)
到第 2 组。
"`${1}$test`$2"
替换是第 1 组 ( ) 的内容,$1
然后是$test
变量的值,然后是第 2 组的值。注意前面的反引号$
是 Powershell 将它们视为文字$
字符所必需的,而不是外推“标记”的字符串。
您需要${1}
而不是$1
因为$test
变量以数字开头,并且当在反向引用(如 )之后直接有数字时$1
,ID 应该用花括号括起来以避免与 Group ID 产生歧义。
推荐阅读
- java - 如何在javaFX中不单击按钮从其他类打开弹出窗口?
- python - Django中两个模型之间的ManyToMany关系
- excel - 如何在 Excel 中将 8.991M 和 0.785M 转换为 8.911.000 和 785.000 之类的数字?
- google-apps-script - 从 GDrive 回收站中删除文件
- python - 如何在 aws sagemaker 中提供每日预先计算的预测?
- facebook - 权限错误 Facebook 自定义转换统计
- python - 使用多处理导入外部模块时使用 Django 视图
- swift - 导航栏中的搜索栏行为在 iOS 13 中不一致
- domain-driven-design - 与患者、牙医、治疗和病史的实体和聚合根源混淆
- flutter - #Flutter Dart 编译器意外退出