#java #string #split
#java #строка #разделение
Вопрос:
У меня есть строка, которая говорит, «1.0 20*30.2-4.0/10.1» который я хочу разделить таким образом, чтобы у меня был строковый массив, скажем
strArr = {"1.0", "20", "30.2", "4.0",10.1}
Для этого я написал следующий код
public class StringSplitDemo {
public static void main(String[] args) {
String str = "1.0 20*30.2-4.0/10.1";
String[] strArr = (str.split("[\ -/\*]"));
for(int i=0;i<strArr.length;i )
System.out.print(strArr[i] " ");
}
}
Вместо того, чтобы печатать ожидаемый результат (мной), т.е. 1.0 20 30.2 4.0 10.1, он печатает
output: 1 0 20 30 2 4 0 10 1
который, похоже, также разделяет строку вокруг «.» даже если я не включил его в шаблон регулярных выражений.
Чего мне здесь не хватает? Как правильно это сделать?
Комментарии:
1.
str.split("[- /*]")
Ответ №1:
Используйте
String str = "1.0 20*30.2-4.0/10.1";
String[] strArr = str.split("[- /*]");
System.out.print(Arrays.toString(strArr));
Посмотрите онлайн-демонстрацию Java
Класс [\ -/\*]
символов соответствует не только 4 символам, которые вы определили, поскольку -
создан диапазон между
и /
.
Вы могли бы исправить регулярное выражение, экранировав дефис, но шаблон выглядит намного чище, когда вы помещаете символ -
в начало (или конец) символьного класса, где вам не нужно экранировать его, так как там дефис обрабатывается как литерал -
.
Комментарии:
1. Вы правы. Это будет чище без использования какого-либо управляющего символа.
2. Спасибо @Wiktor за вашу помощь;
Ответ №2:
Проблема заключалась в регулярном выражении
Поэтому вам нужно escape , иначе он будет обрабатывать его как минимум один раз
String[] strArr = (str.split("[\-/\*\ ]"));
Кстати, escape-символ здесь не требуется. Это может быть просто записано как
String[] strArr = (str.split("[-/* ]"));
Комментарии:
1. Внутри символьного класса
-
необходимо экранировать только из этих 4 символов, и только если они размещены не в конечных позициях.