首页 > 解决方案 > 正则表达式:匹配引号中字符集的第二次出现

问题描述

我正在寻找匹配用引号括起来的字符集的第二次出现。例如:

"{08165EA0-E946-11CF-9C87-00AA005127ED}"="WebCheckWebCrawler"

我只想选择WebCheckWebCrawler,而不是08165EA0-E946-11CF-9C87-00AA005127ED

这是我到目前为止所拥有的,但我无法选择第二次出现。

https://regex101.com/r/Dr7ly2/4

谢谢你的帮助。

标签: regexpowershell

解决方案


通用解决方案

在大多数情况下,通过从字符串中提取所有多个匹配项,然后通过其索引获取必要的项目,可以实现第 n 次匹配。只是 Powershell 中的一个快速示例:

Select-String '"([^"]+)"' -input $str -AllMatches | % { $_.matches } |
    % { $_.groups[1].value } | select -Skip 1 -First 1

在这里,Select-String '"([^"]+)"' -input $str -AllMatches | % { $_.matches } | % { $_.groups[1].value }获取所有匹配项并收集所有 Group 1 值(双引号内的子字符串,不包括引号),并select -Skip 1 -First 1省略第一项并获取下一个成为第一个的项。在其他语言中,也有类似的方法。但是,这需要一些代码并且被认为是“昂贵的”,因为应该为所有匹配项及其内部结构分配内存。

具体解决方案

在文本编辑器中,以及没有允许获取多个正则表达式匹配的正则表达式方法的语言中,上述解决方案不起作用。在这些情况下,这种正则表达式用于获得第二个匹配项:

^(?:.*?"([^"]*)"){2}
^(?:[^"]*"([^"]*)"){2}
^(?:.*?(<YOUR_PATTERN_HERE>)){2}

请参阅正则表达式演示注意:这需要一个正则表达式方法,该方法返回带有捕获的子字符串(子匹配、捕获)的整个匹配对象结构。另外,请注意,.*?默认情况下不匹配换行符,并且比[^"]*它可以匹配换行符的速度慢,并且速度更快。

详情

  • ^- 字符串的开始
  • (?:- 非捕获组开始:
    • .*?- 尽可能少的除换行符以外的任何零个或多个字符
    • "- 一个"字符
    • ([^"]*)- 捕获组 1:任何零个或多个 ( *) 字符,除了"
    • "- 一个"字符
  • ){2}- 小组结束,重复两次。

如果你想要整场比赛怎么办?这取决于正则表达式库。在 Powershell 中,由于 .NET 正则表达式支持无限宽度的后向模式,因此很容易获得:

(?<=^(?:[^"]*"[^"]*"){1}[^"]*")[^"]*(?=")

请参阅此正则表达式演示请注意.*?替换[^"]*为以确保"两者之间不能匹配,"..."否则后视(?<=^(?:[^"]*"[^"]*")将在此处匹配更多字符串。

Powershell 代码片段:

Select-String '(?<=^(?:[^"]*"[^"]*"){1}[^"]*")[^"]*(?=")' -input $str | % { $_.matches.value }

在 PCRE 中,您可以使用

^(?:.*?"[^"]*"){1}.*?"\K[^"]*(?=")

请参阅正则表达式演示。省略了与整体内存匹配相匹配的\K整个文本,因此返回的只是与最后一个匹配的文本部分[^"]*((?=")是一个正向前瞻,其模式匹配不会添加到整体匹配中,因为这是一个非消耗图案)。在 PHP、R、Sublime Text (PCRE)、Ruby (Onigmo)、Notepad++ (Boost) 中使用非常好。\K不幸的是,Powershell 不支持。

当前场景解决方案

您不需要使用如此复杂的模式。您可以使用

="([^"]+)"

请参阅正则表达式演示

细节

  • ="- 一个="子串
  • ([^"]+)- 第 1 组捕获 1 个或多个字符,而不是"
  • "- 一个"

获取第 1 组中的值,$matches[1]

在Powershell中,你需要的值可以这样获取:

PS> $str = '"{08165EA0-E946-11CF-9C87-00AA005127ED}"="WebCheckWebCrawler"';
PS> $pattern = '="([^"]+)"'
PS> $str -match $pattern
True
PS> $matches[1]
WebCheckWebCrawler
PS>

推荐阅读