我有一个存储在数据库中的函数调用列表,对于一些函数调用,我关心函数调用的参数是什么.我用我的程序(在C#中)解析C源代码.我正在尝试找到使用参数获取函数调用的最佳方法.我在解析它之前将源代码读入一个字符串(这样我就不在文件上使用流阅读器了).我尝试使用一些正则表达式(这对我来说有点新)来解析源文件,但在使用这样的正则表达式字符串时检索的不仅仅是函数调用:functionCall +".*\\)"; (我正在逃避开放(在函数调用中)
函数调用以下列格式存储在DB中
Function Call ============ some_Call(
他们以这种方式存储是有原因的,不会改变.
有没有通过正则表达式做到这一点的好方法,还是我更适合浏览源代码内容?
如果需要澄清,请与我们联系.
您的解决方案失败的部分原因是您可能应该使用.*?)
,而不是贪婪的匹配.
一个完整的答案必须遵循至少这些:
忽略字符串和字符中的括号(你可以用正则表达式做,虽然转义它可能有点复杂)
functionCall("\")", ')')
忽略注释中的括号(可以使用正则表达式)
functionCall(/*)*/ 1, // ) 2)
不要太匹配(你可以用正则表达式)
functionCall(1) + functionCall(2) + (2 * 3) // Don't match past the first )
但它也必须忽略平衡的括号
functionCall((1+(1))*(2+2))
最后一个是普通正则表达式无法做到的,因为它涉及计算括号,并且通常是正则表达式不适合的.但是,似乎.NET有办法做到这一点.
(从技术上讲,你必须处理宏,我可以想象一个
#define close_paren )
会破坏你的一天...)
也就是说,你可能会想出一个天真的解决方案(类似于你所拥有的,或其他海报推荐的解决方案),并且它适用于许多情况,特别是如果你正在使用已知的输入.