【问题标题】:PowerShell regex capture differencesPowerShell 正则表达式捕获差异
【发布时间】:2018-11-01 14:53:43
【问题描述】:

目标是仅从字符串中获取空格字符之前的前导数字。当我在 PowerShell 中使用 -replace 时,会包含前导字母字符。为什么会有所不同?

PS C:\src\t> 'aasdf123 456' -replace '([\d]+) .*', '$1'
aasdf123

这不会发生在产生的regex101.com 上。

123

不重复

问题不在于如何获得号码。问题是为什么'aasdf' 匹配\d。捕获组仅指定\d

【问题讨论】:

  • 你需要匹配,而不是替换。
  • 'aasdf123 456' -替换'^([a-zA-Z]+)([\d]+)\s(.*)$', '$2'

标签: regex powershell


【解决方案1】:

这种行为是预期的。

-replace 运算符删除输入字符串中的所有非重叠匹配保留结果中所有不匹配的部分。

'aasdf123 456' -replace '([\d]+) .*', '$1' 将返回 assdf123,因为 ([\d]+) .*(等于 (\d+) .*)匹配并捕获到第 1 组中的一个或多个数字,然后匹配一个空格,然后是该行的其余部分,然后是整场比赛(此处为 123 456)被替换为第 1 组的内容 123,因此,assdf123 保持为 -replace 操作的结果。

您关于 regex101 产生另一个结果的说法是错误的:it produces the same result:

即使您查看 MATCH INFORMATION 窗格,也有两个值:整个匹配,123 456,和第 1 组值,123。因此,根本没有差异。

要获得123,您可以使用How to get the captured groups from Select-String? 中描述的解决方案

【讨论】:

  • 我看到使用 -match 有效。我想将此标记为答案。但是,我想知道assdf 是如何进入一个只包含\d 的组的。
  • @lit 请参阅 'aasdf123 456' -replace '([\d]+) .*', '$1' 将返回 assdf123,因为 ([\d]+) .*(等于 (\d+) .*)匹配并捕获到组 1 一个或多个数字,然后匹配一个空格,然后是行的其余部分,然后将整个匹配项(此处为 123 456)替换为第 1 组的内容 123,因此,将 assdf123 保留为 -replace 操作的结果。 assdf NEVER 进入任何组,它不匹配。在 regex101 屏幕截图中可以清楚地看到:字符串的那部分没有突出显示。
  • 再说一次:-replace 运算符会从输入字符串中删除所有不重叠的匹配项将所有不匹配的部分保留在结果中
  • 好的。我将此标记为答案。看起来因为 'aasdf' 不匹配,所以它被保留在输出结果中。我还得再考虑一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 2011-01-04
  • 2014-01-02
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多