Java正则表达式:如何减少统一字符的序列?
我想用一个长度小于1的括号序列替换字符串中的每个括号序列。 这是一种可能的输入: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
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”
是字符串文字。只有当正则表达式引擎找到匹配项时,它才会填充捕获组值。你应该使用我的代码。