在多行中捕获的正则表达式适用于 regex101.com 但不适用于 PowerShell

Regex to capture in multiline works on regex101.com but not in PowerShell

这是我正在使用的正则表达式code (?m)^.*(10(?:\.\d+){3}\/\d+)\s.*\s(\d+).*$ 假设从该行捕获子网 IP 和最后 4 位数字。一个例外是,如果只有子网 IP 直接跟在新行之后,那么捕获应该在下一行继续。

示例数据:

*> 10.118.130.98/32 172.17.128.161 0 65000 4809 23 8705 8705 8705 8705 i *> 10.118.130.102/32 172.17.128.161 0 65000 4809 23 285 i

捕获组 1 应包含 10.118.130.98/32 和 10.118.130.102/32,捕获组 2 应包含 8705 和 285。这在 regex101.com 上运行良好,但在 PowerShell 中它仅捕获第一行.

我建议将文件作为单个文本变量读取,而不是逐行读取,使用 -Raw,然后使用正则表达式查找仅包含 IP 类字符串后跟端口号和换行符,并删除这些位置的换行符:

(Get-Content $file -Raw) -replace '(?m)^(\d+(?:\.\d+){3}/\d+)[\r\n]+', '' | Set-Content $file

图案详情

  • (?m) - 多行修饰符选项
  • ^ - 行首
  • (\d+(?:\.\d+){3}/\d+) - 第 1 组:1+ 个数字,然后重复 3 个点和 1+ 个数字,然后是 / 和 1+ 个数字
  • [\r\n]+ - 1 个或多个 CR 或 LF 符号。

是包含第 1 组值的占位符。