2

(希望写一个好问题)。

我必须使用正则表达式匹配 Java 中的 RPG 函数。我拥有的功能有以下几种可能的方式:

nameFunction()
nameFunction(params)
nameFunction('otherFunction(' + variable + ')')
nameFunction('otherFunction.get('''+trim(string_variable)+''')')
fun1() + fun2()

其中 ' 用于打开/关闭字符串,并且 ' 也用作 ' 本身的转义字符。我已经尝试过这个正则表达式:

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

与 \w+ 我想匹配名称的地方,然后是 (,所有字符,但没有右括号,最后是闭括号。前两个函数被正确识别,但第三个和第四个函数没有。正则表达式匹配

nameFunction('otherFunction(' + variable + ')
nameFunction('otherFunction.get('''+trim(string_variable)

跳过第三个中的最后一个右括号和第四个中的字符串连接(第五个例子是为了表明我可以有多个函数,我想分别识别它们)。有什么建议么?提前致谢。

4

3 回答 3

1

如果字符串没有转义,您可以使用:

\w+\((?:[^'()]|'[^']*')*\)

如果你想处理反斜杠转义,你可以这样做:

\w+\((?:[^'()]|'(?:[^'\\]|\\.)*')*\)
于 2013-08-06T07:55:34.613 回答
0

如果您只想匹配第一个之前(的文本和最外圆括号之间的所有文本,那么这个基于负前瞻的正则表达式将为您工作:

Pattern p = Pattern.compile("(\\w+)\\s*\\((.*?)\\)(?![^)]*\\))");

与您的所有 4 个示例一起工作。

在线演示: http: //fiddle.re/rmy3a

于 2013-08-06T10:29:04.510 回答
0

您的问题是您不允许在函数参数中使用右括号。

\w+\(.*\)

这可以解决问题。

于 2013-08-06T07:59:07.793 回答