使用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这看起来很有趣,谢谢