我有一个这样的字符串:
IF(expr1,text1,IF(expr2,text2,IF(expr3,text3,text4)))
我需要处理IF(expr3,text3,text4)))
,以便上述内容成为
IF(expr1,text1,IF(expr2,text2,new_text))
我需要继续这样做,直到我有
IF(expr1,text1,new_text3)
我的模式字符串"IF\\(.*?,.*?,.*?\\)"
将匹配整个事物。不是IF(expr3,text3,text4)))
。
Java代码:
String val = "IF(expr1,text1,IF(expr2,text2,IF(expr3,text3,text4)))";
String regx = "IF\\(.*?,.*?,.*?\\)";
Pattern patt1 = Pattern.compile(regx);
Matcher m2 = patt1.matcher(val);
while (m2.find()) {
String val0 = m2.group();
System.out.println( val0 );
}
答案 0 :(得分:1)
实现此目的的一种方法是创建一个使用regex定位并返回任何内部IF语句的方法。在这种方法中,每当你的正则表达式匹配找到另一个内部IF语句时,你就会调用它自己。这是一个非常简化的片段,仅用于演示该概念。这基本上实现了递归正则表达式匹配,但是由于缺乏对标准Java中的递归正则表达式的支持,因此需要手动完成。我在这里即兴创作,因为我没有编译器来测试它。但是,您需要修改匹配的正则表达式以查找第一个内部IF语句。也许像^IF\(.*?,.*?,(IF\(.*\))\)
这样的正则表达式可以起作用吗?
String val = 'IF(expr1,text1,IF(expr2,text2,IF(expr3,text3,text4)))';
String mostInnerIfStatement = getInnerIfStatement(val);
// no inner IF statement found
if(mostInnerIfStatement == null) {
// handle scenario where IF statement has no inner IF statements
}
String getInnerIfStatement(String val) {
String regx = '^IF\\(.*?,.*?,(IF\\(.*\\))\\)';
Pattern patt1 = Pattern.compile(regx);
Matcher m2 = patt1.matcher(val);
// initialize to value passed in
String nextInnerIfStatement = val;
// test if match found
if(m2.find()) {
// call self if another match found
String result = getInnerIfStatement(m2.group());
// if result is null then no more inner IF statements found so do not set nextInnerIfStatement
if(result != null) {
nextInnerIfStatement = result;
}
}
return nextInnerIfStatement;
}