2 回答
TA贡献1783条经验 获得超4个赞
您可以使用 2 个捕获组并在替换中使用它们,其中匹配项_
将被替换为/
^([^_]+)_([^_]+)_
用。。。来代替:
$1/$2/
例如:
String regex = "^([^_]+)_([^_]+)_";
String string = "02_01_fEa3129E_my Pic.png";
String subst = "$1/$2/";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);
String result = matcher.replaceFirst(subst);
System.out.println(result);
结果
02/01/fEa3129E_my Pic.png
TA贡献2037条经验 获得超6个赞
您当前的解决方案几乎没有问题:
这是低效的——因为每个都replaceFirst需要从字符串的开头开始,所以它需要多次迭代相同的起始字符。
它有一个错误- 因为第 1 点。当从开始而不是最后修改的地方迭代时,我们可以替换之前插入的值。
例如,如果我们想两次替换单个字符,每次都用Xlike abc->XXc在代码 like 之后
String input = "abc";
input = input.replaceFirst(".", "X"); // replaces a with X -> Xbc
input = input.replaceFirst(".", "X"); // replaces X with X -> Xbc
Xbc我们将以instead of结尾XXc,因为第二个replaceFirst将替换为Xwith Xinstead of bwith X。
为避免此类问题,您可以重写代码以使用Matcher#appendReplacement和Matcher#appendTail方法,以确保我们将迭代输入一次并可以用我们想要的值替换每个匹配的部分
private static String replaceNMatches(String input, String regex,
String replacement, int numberOfTimes) {
Matcher m = Pattern.compile(regex).matcher(input);
StringBuilder sb = new StringBuilder();
int i = 0;
while(i++ < numberOfTimes && m.find() ){
m.appendReplacement(sb, replacement); // replaces currently matched part with replacement,
// and writes replaced version to StringBuilder
// along with text before the match
}
m.appendTail(sb); //lets add to builder text after last match
return sb.toString();
}
使用示例:
System.out.println(replaceNMatches("abcdefgh", "[efgh]", "X", 2)); //abcdXXgh
添加回答
举报