【发布时间】:2014-01-25 17:14:48
【问题描述】:
究竟如何在将组附加到字符串缓冲区时替换组? 例如: (a)(b)(c) 如何用 d 替换第 1 组,用 e 替换第 2 组,依此类推? 我正在使用 Java 正则表达式引擎。 提前致谢。
【问题讨论】:
究竟如何在将组附加到字符串缓冲区时替换组? 例如: (a)(b)(c) 如何用 d 替换第 1 组,用 e 替换第 2 组,依此类推? 我正在使用 Java 正则表达式引擎。 提前致谢。
【问题讨论】:
你可以使用Matcher'sappendReplacement
这是一个使用示例:
输入:“你好,鲍勃,你的猫怎么样?”
正则表达式:"(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 "";
}
【讨论】:
appendTail() 来完成它。我修好了。
你在寻找这样的东西吗?
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 作为输出。
我想你会看到这个例子的作用。
但是好的,我认为没有现成的内置
你可以说的方法例如:
- 将第 3 组替换为 zzz
- 将第 2 组替换为 yyy
- 将第 1 组替换为 xxx
【讨论】:
find()。如果没有匹配,replaceAll() 只返回原始字符串。
您可以使用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, "!!!"));
}
【讨论】:
appendReplacement() 是一个优雅的解决方案,适用于简单替换就足够的情况。尽管如此,对于那种情况,我认为我的解决方案并不复杂。然而,replaceGroup() 方法解决了一个比简单替换更复杂的问题——并且以一种通用的、参数化的方式。尝试在我的样本main() 上与另一个实现结果,你就会明白我的意思。