regex - 正则表达式:匹配引号中字符集的第二次出现
问题描述
我正在寻找匹配用引号括起来的字符集的第二次出现。例如:
"{08165EA0-E946-11CF-9C87-00AA005127ED}"="WebCheckWebCrawler"
我只想选择WebCheckWebCrawler
,而不是08165EA0-E946-11CF-9C87-00AA005127ED
。
这是我到目前为止所拥有的,但我无法选择第二次出现。
https://regex101.com/r/Dr7ly2/4
谢谢你的帮助。
解决方案
通用解决方案
在大多数情况下,通过从字符串中提取所有多个匹配项,然后通过其索引获取必要的项目,可以实现第 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>
推荐阅读
- python - Python Movie.py - 如何处理(解除分配/关闭)不再使用的剪辑?
- javascript - chrome javascript分析中的“系统”
- laravel - Laravel 身份验证为什么我从其他模型或数据库表中获取数据但在模型本身中却不能?
- python - Django 模板不呈现 {{ }}
- java - 新的 Gradle 依赖项未添加到项目和外部依赖项(VSCode)
- javascript - 从页面的 url 中删除页面的锚点链接
- python - 从 xarray 数据集中选择日期列表
- vb.net - 如何找到正确的窗口 - Process Win 32 VB.NET
- canvas - 将画布 API 集成到对话流聊天机器人或任何聊天机器人?
- macos - 无法通过网络访问外部驱动器