使用Java正则表达式查找具有任意数量嵌套的函数

时间:2016-01-29 16:21:55

标签: java regex

你好其他程序员

我有一个小问题,似乎无法找到合适的答案。

所以我的想法是我从我那里得到一个带有预定义函数的String。 它看起来像这样:

CommunicationID

当我只使用get时,它会变得更复杂甚至更简单。

我想要做的是将每个函数拆分为其参数,这也可以是函数或普通的字符串或数字。

我的想法是我可以使用正则表达式来做到这一点,但我似乎找不到合适的东西。

到目前为止我的正则表达式:

 String expression = "map(%set@IDENTIFIER%, get(%key@Longitude:Number%), get(%key@Latitude:Number%), map(%set@IDENTIFIER%, get(%key@Longitude:Number%), get(%key@Latitude:Number%)))";

我做的是

String regex = "((?<method>map|get)\\((?<parameter>\\%(?<dynamic>set\\@[a-zA-Z_]+|\\$[0-9]+|key\\@[a-zA-Z_]+|set\\@[a-zA-Z_]+)(?<type>:[a-zA-Z]+)*\\%,*)+\\))";

我的输出是这样的:
方法得到 参数%key @ Longitude:Number%
类型:编号
方法得到 参数%key @ Latitude:Number%
类型:编号
方法得到 参数%key @ Longitude:Number%
类型:编号
方法得到 参数%key @ Latitude:Number%
类型:编号

但我想念的是功能图及其所有参数。

希望我的意思是可以理解的。

2 个答案:

答案 0 :(得分:3)

尝试这种ANTRL语法。

grammar Method;

method      : ('map' | 'get') '(' element (',' element )* ')';
element     : method | parameter;
parameter   : '%' dynamic type* '%';
dynamic     : 'set' '@' ID | 'key' '@' ID | '$' NUMBER;
type        : ':' ID;

ID          : [a-zA-Z]+;
NUMBER      : [0-9]+;
Skip        : [ \t\n\r]+ -> skip;

结果是

result

答案 1 :(得分:0)

Java正则表达式不支持递归,这是正则表达式中任意嵌套括号匹配所必需的。即使它确实如此,最好的解决方案是实际解析表达式。

如果您不想使用正确的解析器,那么您应该对其进行标记。将其拆分为函数启动,参数和函数结束的流,然后添加逻辑来处理该流。