0

我的正则表达式有问题。我需要在文本中找到所有功能。我有这个正则表达式\w*\([^(]*\)。它工作正常,直到文本不包含没有函数名称的括号。例如对于这个字符串'hello world () testFunction()',它返回()and testFunction(),但我只需要testFunction(). 我想在我的 c# 应用程序中使用它来解析传递给我的方法字符串。有谁能够帮我?谢谢!

4

5 回答 5

2

编程语言具有层次结构,这意味着在一般情况下它们不能被简单的正则表达式解析。如果您想编写始终有效的正确代码,则需要使用 LR 解析器。如果您只是想应用一个可以获取大多数功能的 hack,请使用以下内容:

\w+\([^)]*\)

但请记住,这在某些情况下会失败。例如,它无法区分函数定义(签名)和函数调用,因为它不查看上下文。

于 2012-04-24T13:57:45.237 回答
1

(\w+)\(

正则表达式组将具有没有任何括号的变量名称,如果需要,您可以稍后添加它们,我想您不需要参数。

如果您确实需要参数,请使用:

\w+\(.*\)

对于贪婪的正则表达式(它将匹配嵌套函数调用)
或...

\w+\([^)]*\)

对于非贪婪的正则表达式(不匹配嵌套函数调用,将仅匹配内部函数调用)

于 2012-04-24T14:05:03.130 回答
1

更改*+(如果它存在于您的正则表达式实现中,否则执行\w\w*)。这将确保\w匹配一次或多次(而不是您当前拥有的零次或多次)。

于 2012-04-24T13:51:10.297 回答
1

尝试\w+\([^(]*\)

这里我将\w* 更改为\w+。这意味着匹配将需要包含至少一个文本字符。

希望有帮助

于 2012-04-24T13:52:42.900 回答
1

这在很大程度上取决于“函数名”的定义。例如,根据您的描述,您只想过滤掉“空”名称,而不希望找到所有有效名称。

如果您当前的解决方案在很大程度上已经足够,并且您对这个空名称有疑问,那么请尝试将 * 更改为 +,在括号前至少需要一个单词字符。

\w+([^(]*)

或者

\w\w*([^(]*)

取决于您的正则表达式应用程序的语法。

于 2012-04-24T13:53:01.090 回答