选择没有数字的数组对象

时间:2017-01-10 18:52:13

标签: regex powershell

我有一个通过Get-Content导入的数组,包含IPS,FQDN和主机名。由于其他用户功能,我能够从所述列表中提取IP地址,但是现在尝试修改所述功能ExtractRawHost我无法获得没有数字的部分。现在我认为这是由于第一个功能在正则表达式中有匹配和地址但是我不明白那里发生了什么。

function ExtractValidIPAddress($String) {
    $IPregex='(?<Address>((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))'
    if ($String -Match $IPregex) {$Matches.Address}
}

function ExtractRawHost($String) {
    $Hostregex='[^a-zA-Z]'
    if ($String -Match $Hostregex) {$String}
}

$raw = Get-Content C:\automation\Monitor\Servers\RawList.txt
$ips = @()
$rawHost = @()
foreach ($server in $raw) {
    $rawHost += ExtractRawHost($server)
    $ips += ExtractValidIPAddress($server)
}

rawList中的内容示例是。

server1
10.10.10.10
server2.atmydomain.com

3 个答案:

答案 0 :(得分:1)

如果您想捕获server2.atmydomain.com,可以使用以下内容:

Function ExtractRawHost($String){
    $Hostregex='.*?(?![\d.]+)(?=\w+\.\w+\.\w+)(?<RawHost>[^\s]+)'
    If ($String -Match $Hostregex) {$Matches.RawHost}
}

不确定powershell是否允许前瞻和否定前瞻,但这是我正在做的事情:

  • .*? - 在我们想要匹配的部分之前寻找可能会或可能不会发生的任何事情。
  • (?![\d.]+) - 否定前瞻(?! ... )表示不应匹配仅由数字\d和点.组成的字符串。这将排除IP地址。
  • (?=\w+\.\w+\.\w+) - 这是一个预测(?= ... ),用于查找字符\w,至少一次+,后跟点.。我再次重复这个第二次和第三次,之后没有点。这只是告诉它格式必须匹配something.something.something
  • (?<RawHost>[^\s]+) - 现在,我们正在命名我们的捕获组(?<RawHost> ... )。它将捕获任何不是空白字符[^\s]的内容,但至少包含一个字符+

给它一个去,让我知道它是否适合你。正如我在上面的评论中提到的,我不知道powershell语法,所以我只是复制了上一个似乎有用的示例中的其余部分。

Here is a demo

答案 1 :(得分:1)

我假设函数ExtractRawHost()应匹配server1之类的行,但不匹配具有IP地址(例如10.10.10.10)或FQDN(例如server2.atmydomain.com)的行。

但是,它的正则表达式[^a-zA-Z]匹配任何包含至少1个字符的行。这不是一个字母,对于所有你的样本输入行都是正确的([...]定义 / 范围 单个字符匹配的字符; ^ 之后的[ 否定该字符集/范围;因为[...]是既没有锚定(例如^$ [...]之外)也没有量化(例如使用+),任何输入中的字符可能匹配)。

假设通过匹配 not 包含句点的行来识别原始主机名就足够了,'^[^.]+$'就可以了。

或者,如果您想更严格地通过以(ASCII)字母开头的行来识别原始主机名,然后是(ASCII)字母和数字的任意组合,请使用'^[a-z][a-z\d]+$' - 请注意,您不需要&#39 ; t分别指定大写字母,因为默认情况下PowerShell的正则表达式匹配不区分大小写。

这是一个基于后者的简化实现,使用switch语句而不是单独的函数;此外,IP地址只需从1 - 3位开始,后跟句点(^\d\{1,3}\.)即可识别。

# Sample input lines.
$lines = @(
    'server1'
    '10.10.10.10'
    'server2.atmydomain.com'
)

$rawHosts = @()
$ips = @()
foreach ($line in $lines) {
    switch -regex ($line) {
        '^[a-z][a-z\d]+$' { $rawHosts += $line; break }
        '^\d{1,3}\.'      { $ips += $line; break }
    }
}

答案 2 :(得分:0)

           Function ExtractValidIPAddress($String){
                $IPregex=‘(?<Address>((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))’
                If ($String -Match $IPregex) {$Matches.Address}
            }

            Function ExtractRawHost($String){
                 $Hostregex=‘(?<Address>((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))’
                 If ($String -notmatch $Hostregex) {$server}
            }


            $place = 0
            $raw = Get-Content C:\automation\Monitor\Servers\RawList.txt
            $ips = @()
            $rawHost = @()
            foreach($server in $raw) {

                $rawHost += ExtractRawHost($server)
                $ips += ExtractValidIPAddress($server)

            }