Каков наилучший способ удалить несколько вхождений символа в строке в Java - PullRequest
5 голосов
/ 13 мая 2010

У меня есть строка типа foo..txt, и я хочу преобразовать ее в foo.txt Вхождение "." может быть больше 2 также. Каков наилучший способ сделать это?

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

foo.bar.txt = foo bar.txt
foo..bar.foo.txt = foo bar.txt

Ответы [ 6 ]

12 голосов
/ 13 мая 2010

С replaceAll()!Например:

string = string.replaceAll("\\.{2,}", ".")

Обратите внимание, что мы должны были избегать точки, поскольку это специальный символ в регулярных выражениях (а также экранирование от обратной косой черты ради Java).Также обратите внимание на {2,}, что означает «совпадение, если оно встречается два или более раз».

5 голосов
/ 13 мая 2010

Я считаю, что вы хотите заменить все точки в части имени файла пробелами, но сохраните расширение, верно?

Если это так, то что-то вроде этого будет уместно:

    String[] tests = {
        "foo.bar.txt",       // [foo bar.txt]
        "foo...bar.foo.txt", // [foo bar foo.txt]
        "........",          // [.]
        "...x...dat",        // [x.dat]
        "foo..txt",          // [foo.txt]
        "mmm....yummy...txt" // [mmm yummy.txt]
    };
    for (String test : tests) {
        int k = test.lastIndexOf('.');          
        String s = test.substring(0, k).replaceAll("\\.+", " ").trim()
           + test.substring(k);
        System.out.println("[" + s + "]");
    }

По сути, это работает так:

  • Сначала найдите lastIndexOf('.') в нашей строке
    • Скажите, что этот индекс равен k, затем мы логически разделили нашу строкув:
      • substring(0, k), префиксная часть
      • substring(k), суффикс (расширение файла) часть
  • Затем мы используем регулярное выражение в префиксной части для replaceAll совпадений \.+ с " "
    • То есть буквальная точка \., повторенная один или несколько раз +
    • Мы также trim() эту строку для удаления начальных и конечных пробелов
  • В результате мы хотим получить преобразованный префикс, объединенный с исходным суффиксом

Пояснения

  • Причина, по которой шаблон \.+ вместо .+, заключается в том, что точка . является метаком регулярных выраженийхарактерно, но в данном случае мы действительно имеем в виду буквальный период, поэтому его необходимо экранировать как \.
  • Причина, по которой этот шаблон как строковый литерал Java равен "\\.+", заключается в том, что \ сам по себеescape-символ строкового литерала Java.Например, строковый литерал "\t" содержит символ табуляции.Аналогично, строковый литерал "\\" содержит символ обратной косой черты;он имеет length() из одного.

Ссылки

4 голосов
/ 13 мая 2010

Вы заставили меня прочитать руководства :) Я решил более общую проблему: как заменить любые 2+ одинаковых символа один за другим только одним и тем же символом:

String str = "assddffffadfdd..o";
System.out.println (str.replaceAll("(.)\\1+", "$1"));

Выход:

asdfadfd.o

Если вам нужно решение только для случая "filename .... ext", то я бы предпочел что-то более простое, как в ответе Etaoin, потому что оно, вероятно, работает быстрее (но не факт). Мое решение, упрощенное для этого конкретного случая, выглядит так:

str.replaceAll("(\\.)\\1+", "$1")
0 голосов
/ 13 мая 2010

использовать replaceAll() как это:

string = string.replaceAll("\\.+(?=.*\\..*)", " ")

Перефразируя регулярное выражение слева направо:

  • "\\.+" Поиск одного или нескольких периодов
  • "(?=.*\\..*)" после оглядки в будущее и нахождения периода

Он обрабатывает упомянутый вами тестовый пример - однако такие случаи, как:

  • .txt.
  • test..txt
  • .test.txt

конвертируются следующим образом:

  • .txt.
  • test .txt
  • test.txt
0 голосов
/ 13 мая 2010

Я предлагаю String.replaceAll .

0 голосов
/ 13 мая 2010
"file....txt".replaceAll("\\.\\.+",".")

Регулярное выражение, которое соответствует всем вхождениям более чем одной точки и заменяет ее одной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...