Java正则表达式:如何减少统一字符的序列?

Java正则表达式:如何减少统一字符的序列?,java,regex,Java,Regex,我想用一个长度小于1的括号序列替换字符串中的每个括号序列。 这是一种可能的输入: String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" + "[src:call[src:name[src:operator='.']]]]" + "[src:call[src:name[src:name='getDisplayFormat']]]]" + "[src:call[src:argumen

我想用一个长度小于1的括号序列替换字符串中的每个括号序列。 这是一种可能的输入:

String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" +        
    "[src:call[src:name[src:operator='.']]]]" +
    "[src:call[src:name[src:name='getDisplayFormat']]]]" +
    "[src:call[src:argument_list='()']]][src:operator='instanceof']]" +
    "[src:name='MathFormat']]";
这是期望输出:

String result = "src:expr[src:call[src:name[src:name='m']]]" +        
    "[src:call[src:name[src:operator='.']]]" +
    "[src:call[src:name[src:name='getDisplayFormat']]]" +
    "[src:call[src:argument_list='()']][src:operator='instanceof']" +
    "[src:name='MathFormat']";
我曾尝试使用Java类执行此操作,但它在两个循环后停止移除括号:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SequenceCutter{
    public static void main(String[] args){
        String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" + 
            "[src:call[src:name[src:operator='.']]]]" +
            "[src:call[src:name[src:name='getDisplayFormat']]]]" +
            "[src:call[src:argument_list='()']]][src:operator='instanceof']]" +
            "[src:name='MathFormat']]";
        Matcher bracketsMatch;
        int subIndex = 0;
        String oldString;
        do {
            bracketsMatch = Pattern.compile("\\]+").
                matcher(toBeParsed.substring(subIndex));
            if (!bracketsMatch.find())
                break;
            subIndex = bracketsMatch.end();
            String match = bracketsMatch.group();
            oldString = toBeParsed;
            toBeParsed = toBeParsed.substring(0, subIndex)
                .replace(match, match.substring(1)) + toBeParsed.substring(subIndex);
        } while (bracketsMatch.find() && !oldString.equals(toBeParsed));
        System.out.println("Result: " + toBeParsed);
    }
}
我想我正在以一种非常复杂的方式做这件事,但我无法找到另一种解决办法。
感谢任何人都会尽力帮助我。

如果您需要将2+
]
符号的任何序列替换为相同的序列减去1
]
,您可以使用

String toBeParsed = "src:expr[src:call[src:name[src:name='m']]]]" +        
        "[src:call[src:name[src:operator='.']]]]" +
        "[src:call[src:name[src:name='getDisplayFormat']]]]" +
        "[src:call[src:argument_list='()']]][src:operator='instanceof']]" +
        "[src:name='MathFormat']]";
System.out.println(toBeParsed.replaceAll("(]+)]", "$1"));


“(]+)]”
模式将匹配并捕获两个或多个
]
符号,并将除最后一个符号外的所有符号放入捕获组。然后,除了最后一个以外的所有内容都将通过
$1
反向引用放回到结果中。

试试看,我曾经尝试过使用
replaceAll
但是做了一些被禁止的事情,比如:
toBeParsed.replaceAll(]+),“$1”。子字符串(1))
。非常感谢。
“$1”
是字符串文字。只有当正则表达式引擎找到匹配项时,它才会填充捕获组值。你应该使用我的代码。