PowerShell正则表达式匹配IP未进行且未遵循IP

时间:2017-09-19 16:03:20

标签: regex powershell

我尝试在PowerShell中使用匹配运算符来查找未执行且未跟随IP的IP地址。我的目标是仅捕获IP,而不是捕获子网掩码后面的IP。此外,我使用了文本文件中的内容,然后使用每行的匹配为每个文件执行了一次。

这是我到目前为止所得到的,而且我似乎没有得到正确的结果:

(?<!\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?!\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

示例数据:

10.0.0.1

字11.11.11.11

字12.12.12.12 255.255.255.0

15.15.15.15 255.255.255.0

预期匹配:

10.0.0.1

11.11.11.11

2 个答案:

答案 0 :(得分:4)

正则表达并不总是答案。

class Article < ApplicationRecord
  has_many :article_categories
  has_many :categories, through: :article_categories
end**

这是做什么的

$IPs = $line.Split().Where({$_ -as [IPAddress]}) if ($IPs.Count -eq 1) { $match = $IPs[0] } 代表当前行。

首先,将其拆分为一个数组(默认情况下$line方法在空格上拆分),然后使用.Split()过滤数组,只包含可以成功转换为{{1}的元素}。这将为您提供该行中所有IP地址的数组。

之后,测试计数是否为1,因此只有在找到单个IP地址时才会继续。

答案 1 :(得分:2)

简化任务的一种方法是使用链式运算符:

$Lines = Get-Content $file
@($Lines) -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' -notmatch '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s+\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' -replace '.+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).+','$1'

以这种方式使用运算符会使它们充当过滤器,因此-match运算符将过滤掉所有不包含IP地址的行,然后-notmatch将过滤掉那些也包含以下子网掩码,最后-replace运算符将从通过两个测试的行中提取IP地址。