【发布时间】:2017-03-15 23:08:52
【问题描述】:
我想在字符串中将每个括号序列替换为长度小一的括号序列。 这是一个可能的输入:
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);
}
}
我想我正在以一种非常复杂的方式做这件事,但我无法找到另一种解决方案。 感谢任何愿意帮助我的人。
【问题讨论】: