我试图使用正则表达式将两个分隔符之间的所有字符替换为另一个字符。替换应该与删除的字符串具有相同的长度。
String string1 = "any prefix [tag=foo]bar[/tag] any suffix";
String string2 = "any prefix [tag=foo]longerbar[/tag] any suffix";
String output1 = string1.replaceAll(???, "*");
String output2 = string2.replaceAll(???, "*");
预期产出为:
output1: "any prefix [tag=foo]***[/tag] any suffix"
output2: "any prefix [tag=foo]*********[/tag] any suffix"
我已尝试"\\\\\[tag=.\*?](.\*?)\\\\[/tag]"
,但这会用一个"\*"
替换整个序列。
我认为"(.\*?)"
是问题,因为它会立即捕获所有内容。
我如何写一些单独替换每个角色的东西?
答案 0 :(得分:2)
您可以逐个捕获内部的字符,并用*:
替换它们public static String replaceByStar(String str) {
String pattern = "(.*\\[tag=.*\\].*)\\w(.*\\[\\/tag\\].*)";
while (str.matches(pattern)) {
str = str.replaceAll(pattern, "$1*$2");
}
return str;
}
像这样使用它会打印你的tx2预期输出:
public static void main(String[] args) {
System.out.println(replaceByStar("any prefix [tag=foo]bar[/tag] any suffix"));
System.out.println(replaceByStar("any prefix [tag=foo]loooongerbar[/tag] any suffix"));
}
模式"(.*\\[tag=.*\\].*)\\w(.*\\[\\/tag\\].*)"
:
(.*\\[tag=.*\\].*)
抓住了开头,最后是中间的一些字符\\w
用于您要替换的字符(.*\\[\\/tag\\].*)
捕获结尾,最后在中间有一些字符替换$1*$2
:
模式为(text$1)oneChar(text$2)
,它将替换为(text$1)*(text$2)
答案 1 :(得分:2)