Вставить пробел после каждого одного или двух символов в строке

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

Не могли бы вы помочь мне написать метод, который обеспечит следующие ожидаемые результаты.

Ожидаемый ввод: 13*21-5+33 Ожидаемый вывод: 13 * 21 - 5 + 33

Исследование, которое я провел: я мог только узнать, как добавлять пробелы между каждым символом в строке, и это не сработает для вычисления выражений с двузначными значениями. То есть: 1 3 * 2 1 - 5 + 3 3. string-in-java">Как вставить пробел после каждого символа существующей строки в Java?

Спасибо


person Singh    schedule 11.05.2012    source источник
comment
Я могу сделать это, используя простой механизм обработки строк, но для этого мне все равно потребуется как минимум 5-7 строк кода. Был бы рад, если бы кто-нибудь опубликовал однострочное решение REGULAR EXPRESSION   -  person AurA    schedule 11.05.2012


Ответы (2)


Это решение нормализует пробелы вокруг каждого оператора.

return expr.replaceAll("(?<=\\d)\\s*([-+/*])\\s*(?=\\d)", " $1 ");
person Marko Topolnik    schedule 11.05.2012
comment
я получаю java.lang.IndexOutOfBoundsException: нет группы 1 при использовании этих строк. - person Singh; 11.05.2012
comment
Извините, забыл скобки. См. редактирование. Или используйте $0 и без скобок. - person Marko Topolnik; 11.05.2012
comment
Большое спасибо! Первоначальная функция, которую я пытался достичь, заключалась в том, чтобы вставить пробелы, если пользователь забыл это сделать, как лучше всего проверить, поставил ли пользователь пробелы или нет? мне нужно только добавить пробелы, если пользователь забыл их добавить - person Singh; 11.05.2012
comment
@NullPointerException Используйте мое второе решение. Этот вставляет пробелы только вокруг операторов, которые отсутствуют. РЕДАКТИРОВАТЬ: теперь он нормализует пространство, добавляя при необходимости, а также удаляя лишнее пространство. - person Marko Topolnik; 11.05.2012
comment
Я думаю, что нашел ошибку. Это решение устраняет пробелы между двумя средними выводами операторов. 6 - 1 Введите инфиксное выражение 2 * 3-10 / 4 исправленное инфиксное выражение :2 * 3-10 / 4 Как видите, вокруг среднего оператора нет пробелов. Хотя в остальном работает идеально. - person Singh; 11.05.2012
comment
на этот раз я получил java.lang.IndexOutOfBoundsException: нет группы 2 - person Singh; 11.05.2012

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

string.replaceAll("\\d+", " $0 ").trim(); // trim in case numbers are first/last
person Bohemian♦    schedule 11.05.2012
comment
Более элегантный, чем принятый ответ только для чисел! - person bobbel; 04.08.2015