2012-08-30 65 views
1

堆棧溢出正則表達式嚮導,我已經搜索谷歌,並沒有找到一個很好的解決方案。我需要從IPCONFIG結果中提取1:N DNS服務器。在下面的例子中,我需要前三個。但是,可能有一個或多或少的情況。通過IPCONFIG的DNS服務器的RegEx

更新:最理想的,我們希望把光標定位在第一個冒號(:)在DNS字符串然後捕獲IP地址,直到我們到了一個字母。因此,如果我們只需從冒號中刪除字符串,就可以運行另一個RegEx來匹配IP。

DNS.*:得到我們的第一個冒號(:)

需要預讀,直到字母字符。

重要提示:由於第三方工具,我們使用,我們只能使用正則表達式:)

這是我一直在使用,作爲IP的正則表達式的值。這將捕獲所有IP的,而不是僅僅在DNS的...

(([0-9]){1,3}.){1,3}[0-9]{1,3}

IPCONFIG例

Subnet Mask . . . . . . . . . . . : 255.255.255.0 
    Default Gateway . . . . . . . . . : 152.225.244.1 
    DHCP Server . . . . . . . . . . . : 10.204.40.57 
    DNS Servers . . . . . . . . . . . : 10.204.127.11 
             10.207.2.50 
             10.200.10.6 
    Primary WINS Server . . . . . . . : 10.207.40.145 
    Secondary WINS Server . . . . . . : 10.232.40.38 
    Lease Obtained. . . . . . . . . . : Tuesday, August 28, 2012 6:45:12 AM 
    Lease Expires . . . . . . . . . . : Sunday, September 02, 2012 6:45:12 A 
+0

您使用哪種語言? – David

+0

更新的帖子回答你的問題。 (Java或Pearl5)謝謝。 – pixelbobby

+0

爲什麼你會接受2或3個八位字節的IP地址?也就是說,中間的'{1,3}'量詞應該只是'{3}',因爲正常形式的IPv4地址總是4個八位字節。 – tripleee

回答

1
#!/usr/bin/env perl 

use strict; 
use warnings; 

my $data = <<END; 
Subnet Mask . . . . . . . . . . . : 255.255.255.0 
Default Gateway . . . . . . . . . : 152.225.244.1 
DHCP Server . . . . . . . . . . . : 10.204.40.57 
DNS Servers . . . . . . . . . . . : 10.204.127.11 
            10.207.2.50 
            10.200.10.6 
Primary WINS Server . . . . . . . : 10.207.40.145 
Secondary WINS Server . . . . . . : 10.232.40.38 
Lease Obtained. . . . . . . . . . : Tuesday, August 28, 2012 6:45:12 AM 
Lease Expires . . . . . . . . . . : Sunday, September 02, 2012 6:45:12 A 
END 

my @ips =(); 

if ($data =~ /^DNS Servers[\s\.:]+((\d{2}\.\d{3}\.\d{1,3}\.\d{1,3}\s*)+)/m) { 
    @ips = split(/\s+/, $1); 
    print "$_\n" foreach(@ips); 
} 
+0

+1嘿:)我們不使用perl腳本只是perl兼容RegEx。我能夠使用您的RegEx字符串!美麗的綠色複選標記最有可能出現。 – pixelbobby

+0

@pixelbobby好吧 - 好吧,只要考慮周圍的腳本「概念驗證」:-) – David

+0

看哪:全能的綠色檢查您的好工作先生。 – pixelbobby

0

我會用unpack,而不是用於解析基於列的數據正則表達式:

#!/usr/bin/env perl 

use strict; 
use warnings; 

while (<DATA>) { 
    my ($ip) = unpack 'x36 A*'; 
    print "$ip\n"; 
} 

__DATA__ 
DNS Servers . . . . . . . . . . . : 10.204.127.11 
            10.207.2.50 
            10.200.10.6 
Primary WINS Server . . . . . . . : 10.207.40.145 
Secondary WINS Server . . . . . . : 10.232.40.38 

您可能需要調整36 t o應該跳過的字符的實際數量。

+0

對不起,它不是Perl的RegEx。我們使用的軟件表示它與RegEx Java和RegEx Perl兼容。非常感謝,雖然...只是希望我們可以使用它。 – pixelbobby

0

比賽

DNS.+?:(\s*([\d.]+).)+ 

,拉出組。這假定你有一個blob中的整個多行字符串,並且提取的文本可能包含換行符和其他空格。 最後一個點是相匹配的新行,你需要使用/m選項

+0

嘿感謝您的帖子。然而這只是拉出第一行和IP地址。它沒有達到第二或第三。我相信我需要一種方法來捕獲冒號之間的字符串:和第一個字母。然後我可以RegEx並獲得IP。 – pixelbobby

0

就個人而言,我會在不同的方向走。我不使用手動解析ipconfig的輸出,而是使用Win32 :: IPConfig模塊。 Win32::IPConfig - IP Configuration Settings for Windows NT/2000/XP/2003

use Win32::IPConfig; 
use Data::Dumper; 

my $host = shift || "127.0.0.1"; 
my $ipconfig = Win32::IPConfig->new($host); 

my @searchlist = $ipconfig->get_searchlist; 
print Dumper \@searchlist; 
+0

我認爲他提到它實際上並不是他正在使用的Perl代碼,所以很遺憾,SPAN不在 – DVK

0

對陣這個表達式(見in action):

DNS Servers.*:\s*(.*(?:[\n\r]+\s+.*(?:[\n\r]+\s+.*)?)?) 

首先捕獲組將是你的三個IP的(atmost爲三個)作爲你的要求。你需要修整空格。

編輯:正則表達式修復爲最多匹配三個IP。如果IP較少,只匹配它們。

+0

這意味着您知道有一到三臺服務器,並且如果您的服務器少於三臺,它將抓取三條任意的行。但是修復它只匹配IP地址可以解決這些問題。 – tripleee

+0

哇,你太親近了。 IRS阻止你的鏈接 - 抱歉。這似乎只匹配前兩個IP。如果我只能從單詞「Primary」開始獲取單個捕捉組,我們就可以開始! – pixelbobby

+0

@tripleee我錯過了這個。儘快修復:) – mmdemirbas