java - 字符串替换所有正则表达式模式以在嵌套时不匹配

标签 java regex string

考虑下面的场景,我有一个输入字符串

"input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]"

替换后我想要的输出字符串全部为 [yes] 将被替换为 Yes 但是,如果它嵌套在辅助或 n-backets 中,则此类模式应该是忽略,这里假设所有左括号都将正确关闭,这里是所需的输出字符串

"input Yes Yes Yes [mk:[yes] [yes] [yes]] Yes [iif:[yes] [yes] [yes]]"
简而言之,这是我的问题,正则表达式可以理解“嵌套”模式吗?或者递归是完成此任务的绝对必要条件,而正则表达式根本不够

如果无法检测无限嵌套的正则表达式,那么像我的示例一样嵌套到第二级怎么样

最佳答案

编辑 1

正如 vks 指出的那样,这不能用正则表达式来完成,所以我编写了一个简单的程序,可以用 Java 为您做同样的事情:

public class Main {

    public static String nestedReplace(String s) {
        int nested =0,i=0;
        StringBuilder o = new StringBuilder();
        while(i<s.length())
        {
            if(nested==0 && s.regionMatches(i,"[yes]",0,4))
            {
                o.append("Yes");
                i += 5;
                continue;
            }
            else if(s.charAt(i) == '[')
                nested++;
            else if(s.charAt(i) == ']')
                nested--;
            o.append(s.charAt(i));
            i++;
        }
        return new String(o);
    }

    public static void main(String[] args) {
        System.out.println(nestedReplace("input [yes] [yes] [yes] [mk:[yes] [yes] [yes]] [yes] [iif:[yes] [yes] [yes]]"));
    }
}

输出:

input Yes Yes Yes [mk:[yes] [yes] [yes]] Yes [iif:[yes] [yes] [yes]]

关于java - 字符串替换所有正则表达式模式以在嵌套时不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33294816/

相关文章:

java - ByteBuffer回收类

Java 8 : How to find kth smallest, 高效

java - JDK 中没有可用的安全随机数生成器

java - 如何使用一个或多个不具体引用任何字段的类方法来设置多个类字段?

Java:使用正则表达式省略文本

用于重叠固定宽度匹配的正则表达式

javascript - 传递给 MVC Controller 操作的 URL 字符串参数以 null 形式到达

c# - RegularExpressionAttribute 不使用表达式来测试点 (\.)

c - 使用 C 进行数字到字符串的映射

c++ - 如何搜索确切的单词?