我需要一个正则表达式来替换第三个匹配的子字符串

时间:2010-10-08 10:30:04

标签: java regex

示例

input: abc def abc abc pqr

我想用xyz替换第三个位置的abc。

output: abc gef abc xyz pqr

提前致谢

3 个答案:

答案 0 :(得分:1)

这样做的一种方法是使用。

String[] mySplitStrings = null;
String.Split(" ");
mySplitString[3] = "xyz";

然后重新加入字符串,它不是最好的方法,但它可以工作,你可以把整个过程放到像这样的函数中。

string ReplaceStringInstance(Seperator, Replacement)
{
  // Do Stuff
}

答案 1 :(得分:1)

将三个片段分组,即被替换字符串之前的部分,被替换的字符串和其余部分,并组装前缀,替换和后缀:

String pattern = String.format("^(.*?%1$s.*?%1$s.*?)(%1$s)(.*)$", "abc");
String result = input.replaceAll(pattern, "$1xyz$3");

此解决方案假设整个输入是一行。如果您有多行输入,则必须替换点,因为它们与行分隔符不匹配。

答案 2 :(得分:1)

有很多方法可以做到这一点,但这里有一个。它假设字母组将用空格分隔,并查找第3个'abc'块。然后用一个替换来替换'xyz'。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class main {
    private static String INPUT = "abc def abc abc pqr";
    private static String REGEX = "((?:abc\\ ).*?(?:abc\\ ).*?)(abc\\ )";
    private static String REPLACE = "$1xyz ";

    public static void main(String[] args) {
        System.out.println("Input: " + INPUT);
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT); // get a matcher object
        INPUT = m.replaceFirst(REPLACE);
        System.out.println("Output: " + INPUT);
    }
}