当前位置: 首页 > 知识库问答 >
问题:

Java正则表达式递归匹配

马浩淼
2023-03-14

我有一个这样的字符串:

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 ); 
}  

共有1个答案

颛孙晗昱
2023-03-14

实现这一点的一种方法是创建一个方法,该方法使用regex定位并返回任何内部IF语句。在这个方法中,每次通过正则表达式匹配找到另一个内部IF语句时,您都会调用自己。这里有一个非常简化的片段,只是为了演示这个概念。这基本上完成了递归正则表达式匹配,但是由于在标准Java中缺乏对递归正则表达式的支持,需要手动完成。我在这里即兴创作,因为我没有一个编译器来测试它。然而,您需要修改匹配的正则表达式来定位第一个内部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;
}

 类似资料:
  • 我希望有一个regex来匹配以开头的所有行,后面跟着以开头的任意数量的行。理想情况下,我希望将带有的每一行放在一个组中。 以下是我希望得到的结果: (为了缩短起见,我用了[...]。) 它实际上给了我这个: 我希望我已经说得够清楚了,你能帮我解决这个问题。请不要犹豫,询问更多的细节。

  • 问题内容: 示例字符串: 我想先进行匹配,然后将其替换为一些文本,以使字符串变为,然后进行匹配。 问题答案: 令人讨厌的是,Javascript没有提供PCRE递归参数,因此要处理嵌套问题远非易事。但是可以做到的。

  • 问题内容: 该字符串可以类似于以下之一: 我想匹配不限数量的“ a(x,y)”。如何使用Regex做到这一点?这是我所拥有的: 它仅匹配“ a(x,y)”的两个递归。 问题答案: Java的标准正则表达式库不支持递归,因此您无法将此类通用嵌套结构与之匹配。 但是在确实支持递归的版本(Perl,PCRE,.NET等)中,您可以使用以下表达式:

  • 字符串可以类似于以下内容之一: 我想匹配无限数量的“a(x,y)”。我如何使用正则表达式来实现这一点?以下是我所拥有的: 它只匹配"a(x, y)"的两个递归。

  • 问题内容: 当字符串以数字开头时,我需要匹配,然后是一个点,然后是一个空格和1个或多个大写字符。匹配必须发生在字符串的开头。我有以下字符串。 我尝试过的正则表达式是: 它不匹配。一个有效的正则表达式将对这个问题有什么作用? 问题答案: (对不起,我先前的错误。大脑现在坚定地投入了。嗯,也许。) 这有效: 分解: =字符串开头 =一个或多个数字 (之所以转义,是因为它在字符串中,因此) =文字(或者

  • 问题内容: 我从以下格式的文件中获取输入: 现在,我想在我的Java代码中读取int1,int2,int3和int4。我该如何在Java中使用正则表达式匹配。谢谢。 问题答案: 为了避免空值: