Java 如何替换正则表达式中的组?
在将组附加到字符串缓冲区时,如何替换组? 例如: (a) (b)(c) 如何用d替换组1,用e替换组2等等? 我正在使用Java正则表达式引擎。Java 如何替换正则表达式中的组?,java,regex,Java,Regex,在将组附加到字符串缓冲区时,如何替换组? 例如: (a) (b)(c) 如何用d替换组1,用e替换组2等等? 我正在使用Java正则表达式引擎。 提前谢谢。你在找这样的东西吗 import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Program1 { publ
提前谢谢。你在找这样的东西吗
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
您可以使用并构建通用替换方法:
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, "!!!"));
}
publicstaticstringreplacegroup(stringregex、stringsource、int-groupToReplace、stringreplacement){
返回replaceGroup(regex,source,groupToReplace,1,replacement);
}
公共静态字符串替换组(字符串正则表达式、字符串源、int-groupToReplace、int-groupOccurrence、字符串替换){
Matcher m=Pattern.compile(regex.Matcher)(源代码);
对于(int i=0;i
选中您可以使用
匹配器的
下面是一个示例,使用:
输入:“你好,鲍勃,你的猫怎么样?”
正则表达式:“(bob|cat)
输出:“你好,爱丽丝,你的狗好吗”
这种情况下,有lambdas不是很好吗?然后,您可以通过一个小循环运行这些lambda,甚至可以利用哈希映射将正则表达式组存储为键,将它们的替换模式存储为值!快点JDK 8!在进行替换之前,无需调用find()
。如果没有匹配项,replaceAll()
只返回原始字符串。@Alanmore同意。已更新。+1,但您忘记通过调用appendTail()
来完成它。我修好了,这比需要的复杂多了。请参阅。@alanmoreappendReplacement()
是一种优雅的解决方案,适用于简单替换即可的情况。即使如此,对于这种情况,我认为我的解决方案并不复杂。尽管如此,方法replaceGroup()
解决了一个比简单替换更复杂的问题,而且是以一种通用的、参数化的方式。试着用另一个在我的示例main()
上获得结果,你就会明白我的意思。我想我可能也找到了另一个解决方案。我想看看switch语句是否能帮助我们解决问题。
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 "";
}