java - 用来自另一个模式的组替换正则表达式模式
问题描述
我有一个字符串
a#?.text1
我还有另外两个字符串,例如c#1.text2
和d#2.text3
我想换#? 如果我选择a#?.text1
的话。如果我选择,那么我想替换为。最简单的方法是什么?我想出了一个使用组的解决方案,但我的团队认为这不是一种有效的方法。这是我的Java代码:a#1.text1
c#1.text2
d#2.text3
a#?.text1
a#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));
}
我得到的反馈是小组效率低下,我必须找到一种更简单的方法来做到这一点。
有一个更好的方法吗?
解决方案
所以看起来你只是想#
从你的两个字符串中提取数字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
}
推荐阅读
- angular - 获取 ng-content 的原始/原始模板值
- elasticsearch - 如何在 Jelastic 上设置 elasticsearch 集群?连接被拒绝
- python - pynput 代码没有给我一个简单的字符串作为键
- tinymce - Tiny.Cloud 不添加域名
- javascript - resize-img module expected `buffer` to be of type `Buffer` but received type `object`. Logging argument returns buffer
- ruby-on-rails - Generic model that has many relationship depending on value of enum
- c - How to properly display names of directories and their subdirectories from a linked list?
- javascript - Why i cant get the object value instead of names: [ [Object], [Object], [Object], [Object] ]?
- python - Difficulties of scraping using requests/pandas/beautiful soup caused by script
- java - Java Hashmap value check