Java 如何根据嵌套标记替换所有标记并识别嵌套状态?

Java 如何根据嵌套标记替换所有标记并识别嵌套状态?,java,regex,nested,Java,Regex,Nested,我有以下案文: ${{stuff${{more stuff}}}} 我想要这个: data(stuff+data(more stuff)) 不是这个: data(stuffdata(more stuff)) 我的代码: int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; Pattern dataPattern = Pattern.compile("\\$\\{\\{(?<DATA>.*?)\\}\\}",

我有以下案文:

  ${{stuff${{more stuff}}}}
我想要这个:

  data(stuff+data(more stuff))
不是这个:

  data(stuffdata(more stuff))
我的代码:

int flags = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;

Pattern dataPattern = Pattern.compile("\\$\\{\\{(?<DATA>.*?)\\}\\}", flags);
Matcher dataMatcher = dataPattern.matcher("");


String raw = "${{stuff${{more stuff}}}}";
dataMatcher.reset(raw);

String result =  dataMatcher.replaceAll("data($1)");
int flags=Pattern.CASE|u不敏感| Pattern.DOTALL;
Pattern dataPattern=Pattern.compile(\\$\\{\\{(?.*?\\}}),标志);
Matcher-dataMatcher=dataPattern.Matcher(“”);
String raw=“${stuff${{more stuff}}}}”;
数据匹配器重置(原始);
字符串结果=dataMatcher.replaceAll(“数据($1)”);

所以。。。如何识别嵌套状态并添加加号???

与我最初的评论(仍然适用于一般情况)相反,我相信您的语法实际上足够简单,可以通过简单的替换来解决问题:

${{     -->     +data(
}}      -->     )

然后,在构建完最后一个字符串后,丢弃第一个字符(即
finalResult.substring(1)

如果它嵌套在3层深的地方会怎么样?6层呢?Regex不是递归解析语言,不适合此问题的一般情况。您必须编写一个真实的(简单的)语法分析器。我建议您替换两次。一个用于“数据”,一个用于“+数据”。否则,将所有替换为
+数据
,并删除第一个
+
字符;)很好!当锤子和钉子都能用时,为什么要使用电动工具:)