Пустой результат при разделении строки с использованием шаблона

#java #regex #java-8 #functional-programming #java-stream

#java #регулярное выражение #java-8 #функциональное программирование #java-stream

Вопрос:

У меня есть следующий код:

 String generalRequest = "4 6*12/3";
String[] operatorsLine = generalRequest.split("[0-9] ");
  

В результате у меня есть избыточное пустое значение в operatorsLine :

«», » «, «*», «/»

Итак, я желаю результата:

» «, «*», «/»


Как пропустить добавление "" значения в массив, используя String.split() метод?

Комментарии:

1. Каков ваш желаемый результат?

2. @Ghanima » «, «*», «/»

Ответ №1:

Вы можете использовать что-то вроде:

 String[] operatorsLine = Arrays.stream(generalRequest.split("[0-9] "))
                               .filter(s -> !s.isEmpty())
                               .toArray(String[]::new);
  

Комментарии:

1. Спасибо, но я получаю следующую ошибку компиляции: Ошибка: (51, 102) java: метод toArray в интерфейсе java.util.stream.Поток<T> не может быть применен к заданным типам; требуется: java.util.function. Найдена функция<A[]>: java.lang. String[] причина: не удается определить переменные типа A (несоответствие аргументов; java.lang. Строка[] не может быть преобразована в java.util.function. IntFunction<A[]>)

2. в new String[0]

3. решено! Спасибо, друг). У меня также всегда возникают проблемы с генераторами функций)

4. Нет проблем, я рад помочь 🙂

Ответ №2:

В этом случае, когда все, что вам нужно, это односимвольные операторы,
сработало бы удаление всех цифр из строки и разделение с помощью пустой строки в качестве разделителя:

 String generalRequest = "4 6*12/3";
String[] operatorsLine = generalRequest.replaceAll("\d", "").split("");
System.out.println(Arrays.toString(operatorsLine));
  

Это выводит:

 [ , *, /]
  

Ответ №3:

Как насчет предоставления второго параметра split(String regex, int limit) методу и ограничения его двумя выходными полями и повторного разделения:

 String generalRequest = "4 6*12/3";
String[] operatorsLine = (generalRequest.split("\d ", 2)[1]).split("\d ");
  

Первое разделение выведет массив: ["", " 6*12/3"] , затем примет первый индекс и разделит его снова с тем же регулярным выражением.

Конечное значение operatorsLine будет [ ,*,/]