首页 > 解决方案 > 用来自另一个模式的组替换正则表达式模式

问题描述

我有一个字符串

a#?.text1

我还有另外两个字符串,例如c#1.text2d#2.text3

我想换#? 如果我选择a#?.text1的话。如果我选择,那么我想替换为。最简单的方法是什么?我想出了一个使用组的解决方案,但我的团队认为这不是一种有效的方法。这是我的Java代码:a#1.text1c#1.text2d#2.text3a#?.text1a#2.text1

Pattern strPattern = Pattern.compile("(\\w+)(#\\?)(\\.\\w+)");
Pattern replacePattern = Pattern.compile("(\\w+)(#\\d+)(\\.\\w+)");

Matcher strMatcher = strPattern.matcher("a#?.text1");
Matcher replaceMatcher1 = replacePattern.matcher("c#1.text2");
Matcher replaceMatcher2 = replacePattern.matcher("d#2.text3");

if(strMatcher.matches() && replaceMatcher1.matches()) {
  String number = replaceMatcher1.group(2);
  return strMatcher.replaceAll(strMatcher.group(1) + number + strMatcher.group(3));
} else if(strMatcher.matches() && replaceMatcher2.matches()) {
  String number = replaceMatcher2.group(2);
  return strMatcher.replaceAll(strMatcher.group(1) + number + strMatcher.group(3));
}

我得到的反馈是小组效率低下,我必须找到一种更简单的方法来做到这一点。

有一个更好的方法吗?

标签: javaregex

解决方案


所以看起来你只是想#从你的两个字符串中提取数字c#1.text2,然后在字符串之后d#2.text3替换。?#a#?.text1

您编写的代码似乎有点多,您创建了两个Pattern,然后您Matcher通过捕获三个组来使用对象进行替换,因为这可以通过一些较短的代码轻松完成,而无需创建两个Pattern对象。

只需提取您需要替换的数字,然后使用这些代码直接使用对象本身的replaceFirst方法在字符串中替换它,String

Pattern replacePattern = Pattern.compile("\\w+#(\\d+)\\.\\w+");
Matcher m = replacePattern.matcher("c#1.text2"); // same way for d#2.text3
if (m.matches()) {
    String digit = m.group(1); // the digit you wanted to extract
    String retVal = "a#?.text1".replaceFirst("(?<=#)\\?", digit); // replace ? preceded by # with the digit using replaceFirst
    System.out.println(retVal); // prints a#1.text1
    return retVal;
} else {
    System.out.println("String doesn't match the pattern");
}

总体而言,您的代码可以紧凑地编写为,

Pattern replacePattern = Pattern.compile("\\w+#(\\d+)\\.\\w+");
Matcher m = replacePattern.matcher("c#1.text2"); // same way for d#2.text3
if (m.matches()) {
    return "a#?.text1".replaceFirst("(?<=#)\\?", m.group(1)); // returns a#1.text1
}

推荐阅读