将regex模式替换为另一个模式的组

时间:2019-03-31 19:07:08

标签: java regex

我有一个类似

的字符串
a#?.text1

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

我要替换#吗?如果我选择a#?.text1,则在a#1.text1c#1.text2中进行选择。如果我选择d#2.text3,那么我想用a#?.text1替换a#2.text1。最简单的方法是什么?我想出了使用小组的解决方案,但我的团队认为这不是一种有效的解决方案。这是我的Java代码:

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));
}

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

因此,您似乎只想从两个字符串#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
}
相关问题