Что лучший способ состоит в том, чтобы удалить несколько происшествий символа в строке в Java

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

редактирование: '.' можение не происходит просто вместе. Происшествия могут быть как ниже также

foo.bar.txt = нечто bar.txt
foo..bar.foo.txt = нечто bar.txt

5
задан Vaishak Suresh 13 May 2010 в 11:56
поделиться

6 ответов

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

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

    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) , суффикс (расширение файла) part
  • Затем мы используем регулярное выражение в части префикса для replaceAll совпадений \. + на ""
    • То есть буквальную точку \ . , повторяется один или несколько раз +
    • Мы также trim () эту строку, чтобы удалить начальные и конечные пробелы
  • . Нам нужен преобразованный префикс, объединенный с исходным. суффикс

Пояснения

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

Ссылки

5
ответ дан 18 December 2019 в 08:27
поделиться

используйте replaceAll () следующим образом:

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

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

  • "\\. + " Найдите один или несколько периодов
  • " (? =. * \\ .. *) " после просмотра вперед и нахождения точки

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

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

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

  • txt.
  • test .txt
  • test.txt
0
ответ дан 18 December 2019 в 08:27
поделиться

With replaceAll()! Вот так:

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

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

12
ответ дан 18 December 2019 в 08:27
поделиться
"file....txt".replaceAll("\\.\\.+",".")

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

0
ответ дан 18 December 2019 в 08:27
поделиться

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

-2
ответ дан 18 December 2019 в 08:27
поделиться

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

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

Выход:

asdfadfd.o

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

str.replaceAll("(\\.)\\1+", "$1")
4
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: