在将组附加到字符串缓冲区时,您是如何确切地替换组的? 例如: (A)(B)(C) 如何用d替换组1,用e等替换组2? 我正在使用Java正则表达式引擎。 提前谢谢。
答案 0 :(得分:3)
您可以使用Matcher's
appendReplacement
以下是使用的示例示例:
输入:“你好bob你的猫怎么样?”
正则表达式:“(bob | cat)”
输出:“你好alice你的狗怎么样”
public static void main(String[] args) {
Pattern p = Pattern.compile("(bob|cat)");
Matcher m = p.matcher("hello bob How is your cat?");
StringBuffer s = new StringBuffer();
while (m.find()) {
m.appendReplacement(s, doReplace(m.group(1)));
}
m.appendTail(s);
System.out.println(s.toString());
}
public static String doReplace(String s) {
if(s.equals("bob")) {
return "alice";
}
if(s.equals("cat")) {
return "dog";
}
return "";
}
答案 1 :(得分:1)
你在找这样的东西吗?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Program1 {
public static void main(String[] args) {
Pattern p = Pattern.compile("(a)(b)(c)");
String str = "111abc222abc333";
String out = null;
Matcher m = p.matcher(str);
out = m.replaceAll("z$3y$2x$1");
System.out.println(out);
}
}
这会将111zcybxa222zcybxa333
作为输出
我想你会看到这个例子的作用。
但是好吧,我认为没有现成的内置 例如,你可以说的方法 - 用zzz替换组3 - 用yyy替换第2组 - 用xxx替换组1
答案 2 :(得分:0)
您可以使用Matcher#start(group)
和Matcher#end(group)
来构建通用替换方法:
public static String replaceGroup(String regex, String source, int groupToReplace, String replacement) {
return replaceGroup(regex, source, groupToReplace, 1, replacement);
}
public static String replaceGroup(String regex, String source, int groupToReplace, int groupOccurrence, String replacement) {
Matcher m = Pattern.compile(regex).matcher(source);
for (int i = 0; i < groupOccurrence; i++)
if (!m.find()) return source; // pattern not met, may also throw an exception here
return new StringBuilder(source).replace(m.start(groupToReplace), m.end(groupToReplace), replacement).toString();
}
public static void main(String[] args) {
// replace with "%" what was matched by group 1
// input: aaa123ccc
// output: %123ccc
System.out.println(replaceGroup("([a-z]+)([0-9]+)([a-z]+)", "aaa123ccc", 1, "%"));
// replace with "!!!" what was matched the 4th time by the group 2
// input: a1b2c3d4e5
// output: a1b2c3d!!!e5
System.out.println(replaceGroup("([a-z])(\\d)", "a1b2c3d4e5", 2, 4, "!!!"));
}
检查 online demo here 。