【问题标题】:What is the equivalent to \K for regex in Powershell?Powershell中正则表达式的\K等价于什么?
【发布时间】:2018-03-18 14:32:58
【问题描述】:

我在 regex101 上创建了一个按预期工作的正则表达式,但问题是其中一部分在 Powershell 中显然无效; \K

本质上,我正在寻找字符串的实例,并在字符串的实例之后返回整个单词。所以这里是一个例子:

\btest\s+\K\S+

这会找到单词test 的每个示例并返回它之后的单词。我确实尝试过使用 Lookaheads 和 Lookbehinds,虽然其中一些确实有效,但它们仍然返回 test 或其他不必要的字符。

有没有办法在 powershell 中复制\K?或者更好的是,任何允许 PowerShell 使用\K 的附加组件?

【问题讨论】:

  • 虽然我喜欢 RegEx101 的界面并且使用过很多次,但它不支持 RegEx 的 .Net 版本。您应该考虑改用RegExStorm
  • Match first executable path in list in PowerShell 的可能重复项 - 标题完全不同,但问题的核心和接受的答案是关于正则表达式 \k
  • 感谢您提供 RegExStorm 链接,这很有帮助!

标签: regex powershell regex-lookarounds


【解决方案1】:

What about something like this: (?<=\btest\b)\s+(\w+)\S+

test 进行积极的回溯,然后是您正在寻找的其他内容,以及对以下单词的捕获组。

PowerShell 使用 .Net RegEx 引擎和 it doesn't support \K as you know it(它用于引用 .Net 中的命名捕获组)。你无法改变这一点。

您可能会使用一些与 .Net 兼容的正则表达式的第三方实现,但似乎不太可能存在这样的事情,因为一般 .Net 有一个相当不错且功能齐全的引擎。

【讨论】:

  • 谢谢Briantist,这确实解决了问题!一开始很棘手,因为使用这种正则表达式模式的选择字符串没有按预期工作。我最终偶然发现使用 [regex]::matches(,) 来完成这项工作。似乎并非所有在 powershell 中使用正则表达式的方法都是平等的 :)。
  • @shannonjk 所有方法都使用相同的底层引擎,但它们以不同的方式返回结果,并且可能使用不同的默认值。 Select-String 例如返回它自己的匹配对象(不仅仅是字符串)。运算符-match 为单个左侧操作数返回布尔值,或为数组 LH-op 返回一个数组。 -replace 返回替换后的字符串。有些填充$Matches,有些则没有。但在后台,他们都使用 .Net 正则表达式引擎。
猜你喜欢
  • 1970-01-01
  • 2022-01-05
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
相关资源
最近更新 更多