Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java正则表达式查找具有任意嵌套数的函数_Java_Regex - Fatal编程技术网

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

使用Java正则表达式查找具有任意嵌套数的函数,java,regex,Java,Regex,各位程序员好 我有个小问题,似乎找不到合适的答案 我的想法是从我这里得到一个带有预定义函数的字符串。 它看起来像这样: String expression=“映射(%)set@IDENTIFIER%,获取(%)key@Longitude:数字%),获取(%%key@Latitude:数字%),地图(%)set@IDENTIFIER%,获取(%)key@Longitude:数字%),获取(%%key@Latitude:数字%)”; 如果我只使用get作为例子,它可能会更复杂甚至更简单 我要做的是

各位程序员好

我有个小问题,似乎找不到合适的答案

我的想法是从我这里得到一个带有预定义函数的字符串。 它看起来像这样:

String expression=“映射(%)set@IDENTIFIER%,获取(%)key@Longitude:数字%),获取(%%key@Latitude:数字%),地图(%)set@IDENTIFIER%,获取(%)key@Longitude:数字%),获取(%%key@Latitude:数字%)”;
如果我只使用get作为例子,它可能会更复杂甚至更简单

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

我想我可以用正则表达式来做这件事,但我似乎找不到正确的方法

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

String regex=“((?map|get)\\(?\\%(?set\\\@[a-zA-Z\+\\$[0-9]+\\\\\\\\@[a-zA-Z\]+\\\\\\\[a-zA-Z]+(?:[a-zA-Z]+]*\%,*)+\”;
我所做的是

Pattern pa=Pattern.compile(regex);
Matcher m=pa.Matcher(表达式);
while(m.find()){
System.out.println(“方法”+m.group(“方法”);
System.out.println(“参数”+m.group(“参数”);
System.out.println(“类型”+m.group(“类型”);
}
我的输出大于此值:
方法get
参数%key@Longitude:Number%
类型:编号
方法get
参数%key@Latitude:Number%
类型:编号
方法get
参数%key@Longitude:Number%
类型:编号
方法get
参数%key@Latitude:Number%
类型:编号

但我错过的是函数映射及其所有参数


希望我的意思可以理解。

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


如果您不想使用正确的解析器,那么应该将其标记化。将其拆分为函数开始、参数和函数结束的流,然后添加逻辑以处理该流。

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

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

试试这种ANTR语法

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;
结果是

试试这个Antral语法

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;
结果是


您错过了它,因为所有方法都嵌套在
map
s中。看见Java正则表达式不支持递归。这里可能正则表达式不是您的解决方案。这听起来更像是递归下降解析器的工作。例如,如果您不想自己编写ANTLR,请查看它。@Sorcen这看起来很有趣,谢谢您错过了它,因为所有方法都嵌套在
map
s中。看见Java正则表达式不支持递归。这里可能正则表达式不是您的解决方案。这听起来更像是递归下降解析器的工作。例如,如果您不想自己编写,请查看ANTLR。@Sorcen这看起来很有趣,谢谢