Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Powershell中捕获正则表达式_Regex_Powershell 4.0 - Fatal编程技术网

Regex 在Powershell中捕获正则表达式

Regex 在Powershell中捕获正则表达式,regex,powershell-4.0,Regex,Powershell 4.0,我要解决这个问题。我想获得文本中与我的模式匹配的所有URL。应该包括URL的第一个参数,但不包括第二个参数 两个问题: 它没有得到第一个URL 我不知道捕获是如何工作的。 在方法1中,我看到了匹配项,但没有看到我放在括号中的内容的捕获文本。在方法2中,我在一些输出上看到了我的捕获,但是得到了比我的捕获更多的额外输出。我喜欢方法2的风格,但方法1试图理解发生了什么,但只是给自己挖了一个更深的洞 $fileContents = 'Misc Text < a href="http://examp

我要解决这个问题。我想获得文本中与我的模式匹配的所有URL。应该包括URL的第一个参数,但不包括第二个参数

两个问题:

它没有得到第一个URL 我不知道捕获是如何工作的。 在方法1中,我看到了匹配项,但没有看到我放在括号中的内容的捕获文本。在方法2中,我在一些输出上看到了我的捕获,但是得到了比我的捕获更多的额外输出。我喜欢方法2的风格,但方法1试图理解发生了什么,但只是给自己挖了一个更深的洞

$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-只需要到第一个参数的末尾。