java - 递归替换为 Java 正则表达式?

标签 java regex recursion

我可以将 ABC(10,5) 替换为 (10)%(5) 使用:

replaceAll("ABC\\(([^,]*)\\,([^,]*)\\)", "($1)%($2)")

但我不知道如何为 ABC(ABC(20,2),5)ABC(ABC(30,2),3+2 )

如果我能够转换为 ((20)%(2))%5 我怎样才能转换回 ABC(ABC(20,2),5)?

谢谢, j

最佳答案

我先回答第一个问题。我无法在单个 replaceAll 中完成任务。我认为这甚至无法实现。但是,如果我使用循环,那么这应该可以为您完成工作:

    String termString = "([0-9+\\-*/()%]*)";
    String pattern = "ABC\\(" + termString + "\\," + termString + "\\)";
    String [] strings = {"ABC(10,5)", "ABC(ABC(20,2),5)", "ABC(ABC(30,2),3+2)"};
    for (String str : strings) {
        while (true) {
            String replaced = str.replaceAll(pattern, "($1)%($2)");
            if (replaced.equals(str)) {
                break;
            }
            str = replaced;
        }
        System.out.println(str);
    }

我假设您正在为数字表达式编写解析器,因此定义了术语 termString = "([0-9+\\-*/()%]*)"。它输出这个:

(10)%(5)
((20)%(2))%(5)
((30)%(2))%(3+2)

编辑 根据 OP 请求,我添加了用于解码字符串的代码。它比前向场景更 hacky:

    String [] encoded = {"(10)%(5)", "((20)%(2))%(5)", "((30)%(2))%(3+2)"};
    String decodeTerm = "([0-9+\\-*ABC\\[\\],]*)";
    String decodePattern = "\\(" + decodeTerm + "\\)%\\(" + decodeTerm + "\\)";
    for (String str : encoded) {
        while (true) {
            String replaced = str.replaceAll(decodePattern, "ABC[$1,$2]");
            if (replaced.equals(str)) {
                break;
            }
            str = replaced;
        }
        str = str.replaceAll("\\[", "(");
        str = str.replaceAll("\\]", ")");
        System.out.println(str);
    }

输出是:

ABC(10,5)
ABC(ABC(20,2),5)
ABC(ABC(30,2),3+2)

关于java - 递归替换为 Java 正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734069/

相关文章:

javascript - RFC 2822 和 ISO 8601 日期格式正则表达式

regex - 如何用sed删除\r字符

php - 用 PHP 替换一个 div 内容

Java Regex 组导致 Stackoverflow 问题

recursion - 结构体一遍又一遍地填充重复数据

javax.命名.NameNotFoundException : jms

java - 在 javascript 中迭代模型映射列表

Linux:递归查找字典中的文件列表

JavaFX 相当于 Swing 的 JSpinner?

Java JList 在使用 KeyListener 时报告不正确的索引