我有一个类似
的字符串a#?.text1
我还有另外两个字符串,例如c#1.text2
和d#2.text3
我要替换#吗?如果我选择a#?.text1
,则在a#1.text1
和c#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));
}
我得到的反馈是,小组效率低下,我必须找到一种更简单的方法来做到这一点。
有更好的方法吗?
答案 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
}