В регулярном выражении против методов без регулярных выражений
Класс String
имеет следующие методы:
- Методы без регулярных выражений:
- Методы регулярных выражений:
Итак, здесь мы видим непосредственную причину вашей проблемы: вы используете шаблон регулярных выражений в методе без регулярных выражений.Вместо replace
вы хотите использовать replaceAll
.
Другие распространенные ошибки:
split(".")
(когда подразумевается буквальный период) matches("pattern")
- это целое -строк матча! - Нет
contains("pattern")
;используйте matches(".*pattern.*")
вместо
На Guava Splitter
В зависимости от ваших потребностей, комбинации String.replaceAll
и split
могут сделатьработа адекватно.Однако для этой цели более специализированным инструментом является Splitter
от Guava.
Вот пример, демонстрирующий разницу:
public static void main(String[] args) {
String text = " one, two, , five (three sir!) ";
dump(text.replaceAll("\\s", "").split(","));
// prints "[one] [two] [] [five(threesir!)] "
dump(Splitter.on(",").trimResults().omitEmptyStrings().split(text));
// prints "[one] [two] [five (three sir!)] "
}
static void dump(String... ss) {
dump(Arrays.asList(ss));
}
static void dump(Iterable<String> ss) {
for (String s : ss) {
System.out.printf("[%s] ", s);
}
System.out.println();
}
Обратите внимание, что String.split
не может пропускать пустые строки в начале / середине возвращаемого массива.Он может пропускать только завершающие только пустые строки.Также обратите внимание, что replaceAll
может чрезмерно "обрезать" пробелы.Вы можете сделать регулярное выражение более сложным, чтобы оно ограничивало только разделитель, но решение Splitter
определенно более читабельно и проще в использовании.
Гуава также имеет (среди многихдругие замечательные вещи) очень удобно Joiner
.
System.out.println(
Joiner.on("... ").skipNulls().join("Oh", "My", null, "God")
);
// prints "Oh... My... God"