2 行正则表达式

fil*_*nza 2 regex powershell

我正在尝试在文本文件中搜索 2 行文本(一个总是一个接一个地放置)。一行总是相同的:#EXTINF:Discovery Science. 然而,第二个总是不同的,但具有以下模式:“http://”ipaddress“:”一些随机端口ip地址“:”随机端口

例子:

#EXTINF:Discovery Science http://95.188.124.44:1234/udp/233.7.70.27:5000
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

$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
}
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 5

为了匹配任何空格,您可以使用\s+(1 个或多个空格)。另外,我假设#EXTINF:Discovery Science文本是已知的,因此用捕获组捕获它没有意义,我建议(http.

还有一点就是\bs在这个表达式中是多余的,最糟糕的部分是用形成的字符类[...]。请注意,字符类匹配方括号内指定符号集中的 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()
}
Run Code Online (Sandbox Code Playgroud)

如果您需要包含端口号:5000,只需添加:\d+到正则表达式:

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

如果您只需要在 之后抓取1 个或多个非空白符号http,请使用:

[regex]$reg = "#EXTINF:Discovery Science\s+(http://\S+)"
Run Code Online (Sandbox Code Playgroud)

  • 你真的需要正则表达式那么精确吗?我认为你需要的只是`[regex]$reg = "#EXTINF:Discovery Science\s+(http://\S+)"` (2认同)