【发布时间】:2017-01-26 18:35:56
【问题描述】:
我需要在文本字符串中搜索所有出现的链式 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)...
我的方法是首先提取对象名称,这是一个不需要使用正则表达式的简单操作。现在,这会将正则表达式解析为以下两个组成部分:
.method(arguments).method(arguments).method(arguments)...
这会产生:
method arguments
method arguments
method arguments
...
arguments 可能为 null(缺失),如 .method(),或者方法实际上可能是一个属性(无括号和参数),如:
.method.method().method(arguments)
这会产生:
method (null)
method (string.Empty)
method arguments
arguments 将包含左括号和右括号之间的所有内容;目前不需要解析这些,因为它们将在后续的 Regex 操作中进行处理。
在我看来,这似乎在 Regex 的能力范围内,可以检测 dot-method-openPar-argumentsStr-closePar 下一个 dot-method-openPar-argumentsStr-closePar 等简单模式。
这是语法的范围 - 没有 cmets,没有 lambda - 只是 object.method(arguments).method()...
我希望这会有所帮助。
【问题讨论】:
-
每个 () 按“(”的顺序创建一个组。您是否尝试过使用较高的 $ 像“$2”或“$3”来查看它们是否包含所需的输出?
-
当我向您介绍这条链时,您的希望将破灭:'method1(").ToString()").method2(1).method3(").Fail()")'
-
前段时间我回答了一个非常相似的question。正则表达式将非常大。