在 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)(?<=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编译器之间的结果不匹配
tsdoc-param-tag-with-invalid-name:@param 块后面应该跟一个有效的参数名称(TypeScript ESLint 和 React)