У меня есть строка как foo..txt, и я хочу преобразовать ее в foo.txt, происшествие '.' может быть больше чем 2 также. Что лучший способ состоит в том, чтобы выполнить это?
редактирование: '.' можение не происходит просто вместе. Происшествия могут быть как ниже также
foo.bar.txt = нечто bar.txt
foo..bar.foo.txt = нечто bar.txt
Я считаю, что вы хотите заменить все точки в части имени файла пробелами, но сохранить расширение, не так ли?
Если так, было бы уместно что-то вроде этого:
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 ()
эту строку, чтобы удалить начальные и конечные пробелы \. +
вместо . +
, состоит в том, что точка .
- это метасимвол регулярного выражения, но в данном случае мы действительно имеем в виду буквальную точку, поэтому ее нужно экранировать как \.
"\\. +"
, состоит в том, что \
сам по себе является escape-символом строкового литерала Java. Например, строковый литерал «\ t»
содержит символ табуляции. Аналогично строковый литерал «\\»
содержит символ обратной косой черты; он имеет длину ()
, равную единице. используйте replaceAll ()
следующим образом:
string = string.replaceAll("\\.+(?=.*\\..*)", " ")
Перефразируя регулярное выражение слева направо:
"\\. + "
Найдите один или несколько периодов " (? =. * \\ .. *) "
после просмотра вперед и нахождения точки Он обрабатывает упомянутый вами тестовый пример - однако, случаи например:
преобразуются следующим образом:
With replaceAll()
! Вот так:
string = string.replaceAll("\\.{2,}", ".")
Обратите внимание, что нам пришлось убрать точку, поскольку это специальный символ в регулярных выражениях (а также убрать обратную косую черту, ради Java). Также обратите внимание на {2,}
, что означает "соответствовать, если встречается два или более раз".
"file....txt".replaceAll("\\.\\.+",".")
Регулярное выражение, которое соответствует всем вхождениям более чем одной точки и заменяет его на одиночная точка.
Вы заставили меня читать руководства :) Я решил более общую задачу: как заменить любые 2+ одинаковых символа один за другим только 1 одинаковым символом:
String str = "assddffffadfdd..o";
System.out.println (str.replaceAll("(.)\\1+", "$1"));
Выход:
asdfadfd.o
Если вам нужно решение только для случая "filename....ext", то я бы предпочел что-то более простое, как в ответе Этаоина, потому что это, вероятно, работает быстрее (но не факт). Мое решение, упрощенное для этого конкретного случая, выглядит так:
str.replaceAll("(\\.)\\1+", "$1")