我尝试在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
答案 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地址。