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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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位数字" \d4$| \d3$| \d2$"

问题是如何在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的值。
另一答案

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

$string -replace '(?<=\b10\.\d0,3\.\d0,3\.\d0,3/\d2).*(?=[ \t]\d1,4\b)', ''

$string -replace '(?m)(?<=^[ \t]*10\.\d0,3\.\d0,3\.\d0,3/\d2).*(?=[ \t]\d1,4[ \t]*$)', ''
另一答案

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

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

说明:

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

[string]将两个数组元素强制转换为字符串。由于PowerShell在将两个项目强制转换为字符串时会自动使用空格将两个项目连接在一起,因此这仅仅是一种快捷方式。

以上是关于在PowerShell中组合两个正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

复杂的正则表达式 - 在Powershell中工作,而不是在Bash中工作

在powershell中获取文件名中正则表达式的索引

求密码是由6-18位字母和数字的混合组成的正则表达式的js代码,谢谢各位大神!!

在 PowerShell 中的正则表达式匹配的每个实例之后附加字符

如何在这个混合的 cmd / powershell 代码中转义毒字符?

组合多个正则表达式替换