Поменяйте местами две подстроки в строке в Java - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь проанализировать некоторый текст, и мне нужно поменять две подстроки в строке, например, в следующем тексте я хочу поменять местами «приятно видеть тебя» и «как дела»

Hi nice to see you? I'm fine Nice! how are you some other text

так что результат должен быть:

Hi how are you? I'm fine Nice! nice to see you some other text

Сначала я написал этот метод и отлично работает для этого простого примера:

    public static String Swap(String source, String str1, String str2) {

    source=source.replace(str1, str2);
    source=source.replaceFirst(str2, str1);

    return source;
}

Мне нужно использовать этот метод для более сложных текстов, таких какследующий, но поскольку replaceFirst использует регулярное выражение, он не может поменяться местами, используя мой метод.

        f(f(x))*g(g(x))

Я хочу поменять местами f (x) и g (x), но это не будет словом.

Есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 24 мая 2018

Попробуйте это:

source=source.replace(str1, str2);

// handle things like "f(f(x))*g(g(x))"
source=source.replaceFirst(Pattern.quote​(str2), Matcher.quoteReplacement(str1));

См. Документацию для Pattern.quote здесь .

См. Документацию для Matcher.quoteReplacement здесь .

Предупреждение: У выбранного вами подхода есть два больших предположения!

  • Предположение № 1: str2 должно появляться в источнике до str1, а
  • Предположение № 2: str2 должно появляться только один раз в строке источника
  • Более того: если одна из строк является подстрокой другой, вы получите неожиданные результаты

Для устранения этих проблем потребуется более общее общее решение .

Например:

String longer = str1;
String shorter = str2;
if(str2.length() > str1.length()) {
    longer = str2;
    shorter = str1;
}
Pattern p = Pattern.compile(Pattern.quote(longer) + "|" + Pattern.quote(shorter));
Matcher m = p.matcher(source);
StringBuffer sb = new StringBuffer();
while (m.find()) {
    String replacement = str1;
    if(m.group(0).equals(str1)) {
        replacement = str2;
    }
    m.appendReplacement(sb, Matcher.quoteReplacement(replacement));
}
m.appendTail(sb);
System.out.println(sb.toString());
...