在 PowerShell 中合并两个正则表达式

Combine two regex in PowerShell

这是我要解析的数据:

10.186.128.0/20 172.17.128.161 0 65000 8788

10.186.128.0/20 172.17.128.161 0 65000 878

10.186.128.0/20 172.17.128.161 0 65000 87

理想情况下,输出应与行首的 IP 地址以及最后 2、3 或 4 位数字相匹配。 所需输出示例:

10.186.128.0/20 8788

10.186.128.0/20 878

10.186.128.0/20 87

我有匹配 IP 地址的正则表达式 "10\.\d*\.\d*\.\d*\/\d\d"

然后我有第二个正则表达式,它将匹配最后 2 或 3 或 4 位数字 " \d{4}$| \d{3}$| \d{2}$"

问题是如何在 PowerShell 中组合这两个正则表达式以获得预期的结果?

谢谢

您可以使用

Get-Content $filepath | Select-String '^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$' -AllMatches | Foreach-Object {$_.Matches} | Foreach-Object {$_.Groups[1].Value + " " + $_.Groups[2].Value}

^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$ 正则表达式 - 参见 its online demo - 匹配:

  • ^ - 字符串开头
  • (10(?:\.\d+){3}/\d+) - 第 1 组:10,然后重复三个点和任意 1+ 位数字,然后是 / 和 1+ 位数字
  • \s.*\s - 一个空格,除换行符以外的任何 0+ 个字符,以及一个空格
  • (\d+) - 第 2 组:1+ 位数
  • $ - 字符串结尾。

所以,

  • Get-Content $filepath读取文件
  • Select-String '^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$' -AllMatches 通过逐行读取文件从文件中获取所有匹配项
  • Foreach-Object {$_.Matches} 一个接一个抓取所有匹配项
  • Foreach-Object {$_.Groups[1].Value + " " + $_.Groups[2].Value} 连接第 1 组和第 2 组值。

如果您的所有数据始终采用发布的格式,使用 -split 似乎要简单得多。

Get-Content -Path file.txt |
    Foreach-Object { [string]($_ -split ' ')[0,-1] }

解释:

-split 使用正则表达式匹配将字符串拆分为字符串数组。这里字符串是根据单个 space 拆分的。 [0,-1] 选择数组的第一个(索引 0)和最后一个(索引 -1)元素。

[string] 将两个数组元素转换为字符串。由于 PowerShell 在将两个项目转换为字符串时自动将它们与 space 连接起来,因此这只是一个快捷方式。

如果只需要一种快速修改字符串的方法
用这两个正则表达式之一简单替换:

$string -replace '(?<=\b10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}\b)', ''

$string -replace '(?m)(?<=^[ \t]*10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}[ \t]*$)', ''