Не получение ожидаемого результата от метода разделения строк Java

#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 символов, и только если они размещены не в конечных позициях.