2015-12-08 133 views
2

我試圖在文本文件中搜索2行文本(其中一個總是放在另一行之後)。一條線總是相同的:#EXTINF:Discovery Science。然而第二個有一個始終是不同的,但有以下模式:「HTTP://」 ip地址「:」一些隨機端口IP地址「:」隨機端口2行正則表達式

例子:

#EXTINF:Discovery Science http://95.188.124.44:1234/udp/233.7.70.27:5000 

這裏是我的代碼:

$file = "C:\1.m3u" 
$Text = [IO.File]::ReadAllText($file) 
[regex]$reg = "([#EXTINF:Discovery Science http://\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b])" 
$match = $reg.match($Text) 
$array = @() 
$array = new-object collections.arraylist 
$array = while ($match.Success) 
{    
    $match.Groups[1].value    
    $match = $match.nextMatch() 
    write-host $match 
} 
+1

你應該從正則表達式中除去'''''''',否則它會尋找在這樣創建的字符類中定義的1個符號。另外,第一個'\ b'是多餘的,你可以刪除它('// \ d {1,3}'...) –

+0

我沒有在你的示例文本(或你的正則表達式)中看到第二行, ,但第一個端口和第二個IP地址之間的附加文本「/ udp /」。另外,你不需要匹配單詞邊界,所以刪除'\ b'。 –

+0

啊,是的,可能會有一個linebreak!然後,爲了安全起見,我認爲你可以使用'(#EXTINF:Discovery Science \ s + http:// \ d {1,3} \。\ d {1,3} \。\ d {1,3 } \。\ d {1,3})'。 '\ s'匹配任何空格。 –

回答

4

爲了匹配任何空格,你可以使用\s+(1個或多個空格)。另外,我假設#EXTINF:Discovery Science文本是已知的,因此在捕獲組中捕獲它沒有意義,並且我建議在http之前移動(

另一點是,\b s爲冗餘在該表達式中,並且它的最糟糕的是與[...]形成字符類。請注意,字符類與方括號內指定的一組符號匹配1個符號。你只需要刪除它們。

下面是一個工作演示返回http://95.188.124.44

$Text = "#EXTINF:Discovery Science`r`nhttp://95.188.124.44:1234/udp/233.7.70.27:5000" 
[regex]$reg = "#EXTINF:Discovery Science\s+(http://\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" 
$match = $reg.match($Text) 
$array = @() 
$array = new-object collections.arraylist 
$array = while ($match.Success) 
{    
    write-host $match.Groups[1].value    
    $match = $match.nextMatch() 
} 

如果您需要包含端口號:5000,只需添加:\d+的正則表達式:

[regex]$reg = "#EXTINF:Discovery Science\s+(http://\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+)" 

如果你只需要抓住http之後有1個或多個非空白符號,用途:

[regex]$reg = "#EXTINF:Discovery Science\s+(http://\S+)" 
+0

我們幾乎有現在我得到:#EXTINF:探索科學 ^ h TTP://95.188.124.44:1234 Howevere人仍下落不明IP的第2部分:/udp/233.7.70.27:5000 最終的結果應該是: #EXTINF:發現科學h ttp://95.188.124.44:1234/udp/233.7.70.27:5000 –

+2

你真的需要這個正則表達式嗎?我認爲你所需要的只是'[regex] $ reg =「#EXTINF:Discovery Science \ s +(http:// \ S +)」' –

+0

完美!謝謝 –