这个 Powershell 正则表达式是如何工作的?

4
'<Relation From="701047080" ObjectNumber="166543300" Output="77" To="464616324">' -match '(?<=Output=")[^"]*'

$matchs现在包含77?

这是我想要的,只是我不明白为什么它起作用了?

我找到了一些关于如何做的东西:

match '(?<NAME>Some regex)'

但是我不知道'(?<='是什么意思?我真的很想理解这个语法...

实际上,我需要提取Output和To两个值...而且只有在系统上安装了powershell才能执行此操作...

2个回答

4
表达式(?<=Output=")是一个向后查找。它仅在字符串Output="之后立即匹配。
表达式[^"]*是一个否定字符类。它匹配所有字符,直到下一个双引号(如果没有更多的双引号,则匹配到字符串末尾)。

我理解 [^"]* 这部分。但是感谢您提供了一个描述“lookbehind”的链接,我的所有关于 PowerShell 正则表达式的搜索都没有解释那部分。 - NoMoreZealots

3

[^"]+(?=" Output=")的意思是匹配除了"之外的任意字符,并且这些字符是紧跟在Output="后面的。 [^"]+是主要表达式。

(?<=Output=")是一个向后查找,确保主要表达式跟随在查找表达式之后,即Output="。查找表达式不包括在匹配中。

我认为正则表达式不是最优的。

你可以使用以下表达式代替:

'<Relation From="701047080" ObjectNumber="166543300" Output="77" To="464616324">' -match 'Output="(.*?)"'

(正则表达式如下:Output="(.*?)")

然后在$matches[1]中得到了77。

这个正则表达式可能只是通过后顾断言来使Output="不参与匹配。这使得正则表达式变得更加复杂,降低了性能。你只需要使用上面的正则表达式,并提取出适当的组中的77即可。


1
我也很喜欢你的回答,但是我只能选择一个“正确答案”。由于我要求解释为什么它有效,所以我决定提供一个关于lookbehind实际上是什么的描述链接是更正确的答案。不过,我很喜欢你向我展示的更简单的正则表达式!非常感谢! - NoMoreZealots

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接