Мне нужно регулярное выражение для замены 3-й подходящей подстроки - PullRequest
0 голосов
/ 08 октября 2010

Пример

input: abc def abc abc pqr

Я хочу заменить abc на третьей позиции на xyz.

output: abc gef abc xyz pqr

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 08 октября 2010

Сгруппируйте три сегмента, которые являются частью перед замененной строкой, замененной строкой и остальными, и соберите префикс, замену и суффикс:

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

Это решение предполагает, что весь вводэто одна строка.Если у вас есть многострочный ввод, вам придется заменить точки, поскольку они не соответствуют разделителям строк.

1 голос
/ 08 октября 2010

Есть много способов сделать это, но вот один. Предполагается, что группы букв будут разделены пробелами, и ищет третий блок '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);
    }
}
1 голос
/ 08 октября 2010

Один из способов сделать это - использовать.

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

И затем воссоединение со строкой, это не лучший способ сделать это, но это работает, вы можете поместить весь процесс в такую ​​функцию, как.

string ReplaceStringInstance(Seperator, Replacement)
{
  // Do Stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...