Regex 在Powershell中捕获正则表达式
我要解决这个问题。我想获得文本中与我的模式匹配的所有URL。应该包括URL的第一个参数,但不包括第二个参数 两个问题: 它没有得到第一个URL 我不知道捕获是如何工作的。 在方法1中,我看到了匹配项,但没有看到我放在括号中的内容的捕获文本。在方法2中,我在一些输出上看到了我的捕获,但是得到了比我的捕获更多的额外输出。我喜欢方法2的风格,但方法1试图理解发生了什么,但只是给自己挖了一个更深的洞Regex 在Powershell中捕获正则表达式,regex,powershell-4.0,Regex,Powershell 4.0,我要解决这个问题。我想获得文本中与我的模式匹配的所有URL。应该包括URL的第一个参数,但不包括第二个参数 两个问题: 它没有得到第一个URL 我不知道捕获是如何工作的。 在方法1中,我看到了匹配项,但没有看到我放在括号中的内容的捕获文本。在方法2中,我在一些输出上看到了我的捕获,但是得到了比我的捕获更多的额外输出。我喜欢方法2的风格,但方法1试图理解发生了什么,但只是给自己挖了一个更深的洞 $fileContents = 'Misc Text < a href="http://examp
$fileContents = 'Misc Text < a href="http://example.com/Test.aspx?u=a1">blah blah</a> More Stuff <a href="http://example.com/Test.aspx?u=b2&parm=123">blah blah </a> Closing Text'
#Sample URL http://example.com/Test.aspx?u=a1&parm=123
$pattern = '<a href="(http://example.com/Test.aspx\?u=.*?)[&"]'
Write-Host "RegEx Pattern=$pattern"
Write-Host "----------- Method 1 --------------"
$groups = [regex]::Matches($fileContents, $pattern)
$groupnum = 0
foreach ($group in $groups)
{
Write-Host "Group=$groupnum URL=$group "
$capturenum = 0
foreach ($capture in $group.Captures)
{
Write-Host "Group=$groupnum Capture=$capturenum URL=$capture.value index=$($capture.index)"
$capturenum = $capturenum + 1
}
$groupnum = $groupnum + 1
}
Write-Host "----------- Method 2 --------------"
$urls = [regex]::Matches($fileContents, $pattern).Groups.Captures.Value
#$urls = $urls | select -Unique
Write-Host "Number of Matches = $($urls.Count)"
foreach ($url in $urls)
{
Write-Host "URL: $url "
}
Write-Host " "
输出:
----------- Method 1 --------------
Group=0 URL=<a href="http://example.com/Test.aspx?u=b2&
Group=0 Capture=0 URL=<a href="http://example.com/Test.aspx?u=b2&.value index=81
----------- Method 2 --------------
Number of Matches = 2
URL: <a href="http://example.com/Test.aspx?u=b2&
URL: http://example.com/Test.aspx?u=b2
Powershell版本5.1.17763.592
我不知道捕获是如何工作的
捕获组0始终是整个匹配-未命名的捕获组将编号为1到9,因此您需要组1
我重新命名了变量,以使其含义更清楚:
$MatchList = [regex]::Matches($fileContents, $pattern)
foreach($Match in $MatchList){
for($i = 0; $i -lt $Match.Groups.Count; $i++){
"Group $i is: $($Match.Groups[$i].Value)"
}
}
如果要收集所有捕获的url,只需执行以下操作:
$urls = foreach($Match in $MatchList){
$Match.Groups[$i].Value
}
如果只需要第一个匹配项,则不需要调用[regex]::手动匹配-PowerShell将在使用-match运算符时自动将任何捕获组的字符串值注入自动$Matches变量中,因此如果您这样做:
if($fileContents -match $pattern){
"Group 1 is $($Matches[1])"
}
# or
if($fileContents -match $pattern){
$url = $Matches[1]
}
。。。您将获得预期的结果:
Group 1 is http://example.com/Test.aspx?u=b2
我不知道捕获是如何工作的
捕获组0始终是整个匹配-未命名的捕获组将编号为1到9,因此您需要组1
我重新命名了变量,以使其含义更清楚:
$MatchList = [regex]::Matches($fileContents, $pattern)
foreach($Match in $MatchList){
for($i = 0; $i -lt $Match.Groups.Count; $i++){
"Group $i is: $($Match.Groups[$i].Value)"
}
}
如果要收集所有捕获的url,只需执行以下操作:
$urls = foreach($Match in $MatchList){
$Match.Groups[$i].Value
}
如果只需要第一个匹配项,则不需要调用[regex]::手动匹配-PowerShell将在使用-match运算符时自动将任何捕获组的字符串值注入自动$Matches变量中,因此如果您这样做:
if($fileContents -match $pattern){
"Group 1 is $($Matches[1])"
}
# or
if($fileContents -match $pattern){
$url = $Matches[1]
}
。。。您将获得预期的结果:
Group 1 is http://example.com/Test.aspx?u=b2
使用带有参数-AllMatches的selectstring从输入字符串中获取所有匹配项。正则表达式应该如下所示:?使用带有参数-AllMatches的selectstring从输入字符串中获取所有匹配项。您的正则表达式应该如下所示:?选择字符串模式'?第一个URL不匹配,因为@AnsgarWiechers之间有一个额外的空间,我喜欢使用本机方式,但是仍然无法让它工作:$URL=Select-String-InputObject$fileContents-Pattern'?您需要扩展Select-String.Select-String-Pattern'生成的匹配值?第一个URL不匹配,因为@AnsgarWiechers之间有一个额外的空间,我喜欢使用本机方式,但是仍然无法让它工作:$URL=Select-String-InputObject$fileContents-Pattern'?您需要扩展Select-String生成的匹配值。谢谢!是否有这样的快捷方式:$URL=$MatchList.Groups[1].Value。您是否还想将$groups留在$matchList=$groups=[regex]。。。或者这仅仅是一个复制/粘贴错误。@NealWalters这是一个复制错误:在您的分区中更新了应答,以获取所有捕获的URL:这就是所需的全部内容,只需要下标1:$URL=foreach$Match in$MatchList{$Match.Groups[1].Value}谢谢!是否有这样的快捷方式:$URL=$MatchList.Groups[1].Value。您是否还想将$groups留在$matchList=$groups=[regex]。。。或者这仅仅是一个复制/粘贴错误。@NealWalters这是一个复制错误:在您的部分中更新了应答,以获取所有捕获的URL:这就是所需的全部,只需要下标1:$URLS=foreach$Match in$MatchList{$Match.Groups[1].Value}很好,这种语法总是让我困惑。您的模式返回整个URL,我不想要&parm=123。当我替换$pattern时,它返回的参数太多。@如果要删除结果上的整个参数列表,只需运行-replace'&.*'或-replace'\?.*'即可删除后面的参数。先提取整个URL,然后再修剪它们更容易。我试着使用中所有内容的捕获。可能对未来的应用也有好处。你也有-那么你不是只捕捉括号之间的东西吗?我想我的观点是我的正则表达式是正确的,而你似乎在解决一个不同的问题。@NealWalters我在回答中已经提到了一个积极的lookbehind断言:?谢谢,但我不想要整个URL-只想要到第一个参数的末尾。很好,这种语法一直让我困惑。您的模式返回整个URL,我不想要&parm=123。当我替换$pattern时,它返回的参数太多。@如果要删除结果上的整个参数列表,只需运行-replace'&.*'或-replace'\?.*'即可删除后面的参数。先提取整个URL,然后再修剪它们更容易
所有的东西都在里面。可能对未来的应用也有好处。你也有-那么你不是只捕捉括号之间的东西吗?我想我的观点是我的正则表达式是正确的,而你似乎在解决一个不同的问题。@NealWalters我在回答中已经提到了一个积极的lookback断言:?谢谢,但我不想要整个URL-只需要到第一个参数的末尾。