在 Param (...) 块之间匹配 [STRING]

Posted

技术标签:

【中文标题】在 Param (...) 块之间匹配 [STRING]【英文标题】:Matching [STRING] between Param (...) block 【发布时间】:2019-03-16 13:52:35 【问题描述】:

如果您查看以下代码 sn-p,我正在尝试匹配 Param ( ... ) 块内的所有 [STRING]

我在这方面已经有一段时间了,但我似乎不知道该怎么做。我尝试使用前瞻、后瞻、递归和引用捕获组。

我目前拥有的:(?<=Param\(\s*\1|)(\[\w*\])

代码:

Param(
    [STRING]$CustomerName,
    [STRING]$ClusterName,
)

[STRING]$CustomerName,
[STRING]$ClusterName,

如果第一个[STRING] 也匹配Param (,我想用正则表达式实现匹配所有[STRING]。 然后继续匹配直到找到右大括号)

Regex101 演示:https://regex101.com/r/hVeb8R/1

我在那里使用 javascript,因为它似乎与 C# 的预期功能非常匹配。

【问题讨论】:

它是什么语言或工具? 对不起,它是 C# .NET 你真幸运。试试(?<=Param\([^()]*)\[\w+]。根据您当前的要求,它可以满足您的需求。但是,您不应该在 regex101 中使用它。它是 .NET 特定的,而 regex101 不支持 .NET。但是在最新版本的 Chrome 中,通过切换到 javascript 引擎,您会看到预期的输出 regex101.com/r/68KpvA/1 确实有效!谢谢!不过我很困惑,我不明白它是如何工作的,我可以看到^() 并理解它是打开和关闭大括号,但是引擎如何知道我们想要的匹配在大括号中间?如果这有意义吗? 如果您想确保字符串在括号内,@"(?<=Param\([^()]*)\[\w+](?=[^()]*\))" 也需要先行。见this .NET regex demo 【参考方案1】:

.NET 支持后视中的无限重复。一种在 RegEx 引擎世界中并不常见的功能。通过调用该功能,您可以使用以下方法实现所需的结果:

(?<=Param\([^()]*)\[\w+]

lookbehind 中的模式确保在不超出括号的情况下应该找到Param( 上的匹配项。 [^()] 表示在查找 Param( 时从不匹配括号。差不多了,但是如果您想再次检查 [STRING] 后跟一个右括号,您必须像这样附加一个积极的前瞻:

(?<=Param\([^()]*)\[\w+](?=[^()]*\))

使用 Chrome,请参阅 live demo here

【讨论】:

我有一个新问题,与我的问题和您的回答有些相关,但我总是可以发布一个新问题,或者只是多摆弄一下。如果您查看此演示:regex101.com/r/qYtvmj/1,您会看到 [STRING] 不再突出显示,因为其他东西也有大括号。 永远不要使用你不知道它到底做什么的正则表达式。您的新要求需要通过更多步骤来完成。你要换人吗? 我打算用它来突出显示 Param 块内 [...] 之间的所有类型。 试试(?m)(?&lt;=Param\s*\(\s*(?:^(?!\s*(?:Param\s*\(|\))).*\s*)*)\[\w+] 但这高度依赖于您当前的格式并且可能很容易损坏。在此处查看现场演示regex101.com/r/tXAuTY/1 谢谢,我已经按照我的全部要求修改了:regex101.com/r/tXAuTY/2

以上是关于在 Param (...) 块之间匹配 [STRING]的主要内容,如果未能解决你的问题,请参考以下文章

C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配

解析分号分隔的列表

hiho一下159

tsdoc-param-tag-with-invalid-name:@param 块后面应该跟一个有效的参数名称(TypeScript ESLint 和 React)

java HttpURLConnection 接口调用

thinkphp6速查手册