繁体   English   中英

C# 正则表达式搜索点函数及其参数

[英]C# Regex search for dotted functions and their arguments

我需要在文本字符串中搜索所有出现的类似 C# 的链式函数。 例如,我想打破每个方法及其字符串的括号参数,例如:

object.method(1, "2", abc).method2().method3("test(), 1, 2, 3").method4("\"Hi\"")

这是我几乎使用过的正则表达式模式:

(?<objectName>[^\}]*?)\.(?<methodName>[^\}]*?)\(((?:[^;"']|"[^"]*"|'[^']*')+)*?\)

这将正确提取 objectName 和第一个 methodName,但块

1, "2", abc).method2().method3("test, 1, 2, 3").method4("\\"Hi\\""

全部进入第三个参数“$ 1”。

我的最新方法是通过删除 objectName 规范来分而治之,因为它很容易解析。 这导致我使用:

\.(?<methodName>[^(]*?)\(((?:[^;"']|"[^"]*"|'[^']*')+)*?\)

显然没有objectName,这会产生与以前相似的结果。 我这样做是为了看看我是否可以获得全局结果但可以获得正确的正则表达式语法。

总之,我需要将多个链接的 .method(parameters) 事件解析为名为“methodName”和“parameters”的组成部分。 我已经推断出一些东西,但我的正则表达式技能充其量只是生疏,目前无法克服这一点。 我感谢您提供的任何帮助。

我一直在使用这个站点进行测试: http : //regexstorm.net/tester

更新:澄清一下,要求不包括支持 C# lambda 表达式,仅包括点函数语法。 这不是一个完整的 C# 解析器。 唯一需要的是虚线方法链接。 对于任何混淆,我深表歉意。 我希望突破的模式是:

object.method(arguments).method(arguments).method(arguments)...

我的方法是首先提取对象名称,这是一个不需要使用正则表达式的简单操作。 现在,将以下内容留给 Regex 解析为两个组成部分:

.method(arguments).method(arguments).method(arguments)...

这将产生:

method   arguments
method   arguments
method   arguments
...

参数可能为空(缺失),如在 .method() 中,或者方法实际上可能是一个属性(没有括号和参数),如:

.method.method().method(arguments)

这将产生:

method   (null)
method   (string.Empty)
method   arguments

参数将包含左括号和右括号之间的所有内容; 此时不需要解析这些,因为它们将在后续的 Regex 操作中处理。

在我看来,Regex 有能力检测这种简单的 dot-method-openPar-argumentsStr-closePar 模式,下一个 dot-method-openPar-argumentsStr-closePar 等等。

这是语法的范围 - 没有注释,没有 lambda - 只是 object.method(arguments).method()...

我希望这有帮助。

这不能通过正则表达式正确完成,因为您的参数太不可预测了,并且正则表达式语法级别与 C# 解析器语法无法比拟。 例如,它可以包含具有任何内容的字符串:

method1("x.hiThere().lol()").method2()

它可以嵌套:

method1(x=>method2().method3())

它可以做到这一点:

a("b().c()",d=> d(").hi()"))

对于您的问题解决方案,您需要了解Grammars ,并为此特定任务编写 C# 语法。 在框架方面,您可以从ANTLR项目开始。

解释

你不能这样做的原因是语法类型差异。 正则表达式使用常规语言并且是乔姆斯基层次结构中的Type-3 C# 使用上下文无关语言并且是 Chomsky 层次结构中的Type-2

如果你用视觉来表示它,C# 是比 Regex 语言更强大的语言:

在此处输入图片说明

例如,您的情况陷入解析器的坑只是因为 C# 中的 lambda:

method1(x=>
{
    ....
    /* some code here */
    ....
}).method2()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM