在多行中捕获的正则表达式适用于 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 组值的占位符。
这是我正在使用的正则表达式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 组值的占位符。