У меня возникают проблемы с модификацией строк, которые должны быть разделены пробелом в специальном случае , добавляя пробелы ко всем нечисловым символам.JAVA: Пространство, ограничивающее все нечисловые символы в строке
Мой код должен содержать строку, представляющую математическое уравнение, и разбивать ее на отдельные части. Он делает это, используя пробелы в пространстве между значениями. Эта часть отлично работает, если строка уже ограничена. Проблема в том, что я не всегда получаю вход с пространственным разделением. Чтобы справиться с этим, я хочу сначала вставить эти пробелы, чтобы массив был создан правильно.
Что должен делать мой код, это взять любой символ, который НЕ является числом, и добавить пробел до и после него.
Нечто подобное: 3 * 24 + 321 становится 3 * 24 + 321 или ((3,0) * (2.5)) становится равным ((3,0) * (2.5))
Очевидно, что мне нужно избегайте вставки пробела в числах, или 2.5 становится 2. 5, а затем вводится в массив как 3 элемента. которого нет.
До сих пор я попытался с помощью
Строка InputLineDelmit = InputLine.replaceAll ("\ B", "«);
, который успешно меняет строку всех букв «abcd» на «a b c d» Но он совершает ошибки, когда он сталкивается с числами. Используя этот метод, я получил, что:
(((1) * (2))) становится (((1) * (2))) ---- * Числа должны быть отделены от скобок
12,7 + 3,1 становится равным 1 2,7 + 3,1 * 12,7 ----- расщепляется
51/3 становится 5 1/3 ----- * Та же проблема
и 5 * 4-2 делает не меняются вообще.
Итак, я знаю, что \ D может использоваться как регулярное выражение для всех не чисел в java. Однако мои попытки реализовать это (путем замены или объединения его с \ B выше) привели либо к ошибкам компилятора, либо к ЗАМЕНЕ символа пробелом, а не добавлением одного.
EDIT:
==== Ответил! ====
Это не позволит мне добавить свой собственный ответ, потому что я новичок, но редактирование кода neo108 ниже (которое само по себе не работает) выполнило эту работу. То, что я сделал, это изменить его, чтобы проверить isDigit, а не isLetter, а затем ничего не делать в этом случае (или в специальном случае десятичного числа, для парных). В противном случае символ изменяется на наличие пробелов с обеих сторон.
public static void main(String[] args){
String formula = "12+((13.0)*(2.5)-17*2)+(100/3)-7";
StringBuilder builder = new StringBuilder();
for (int i = 0; i < formula.length(); i++){
char c = formula.charAt(i);
char cdot = '.';
if(Character.isDigit(c) || c == cdot) {
builder.append(c);
}
else {
builder.append(" "+c+" ");
}
}
System.out.println("OUTPUT:" + builder);
}
ВЫХОД: 12 + ((13.0) * (2,5) - 17 * 2) + (100/3) - 7
Тем не менее, любые идеи о том, как сделать это более кратко, а также достойное объяснение StringBuilders, будет оценено по достоинству. А именно, что с этим пределом из 16 символов, о которых я читал в javadocs, как показано выше, показывает, что у вас может быть больше выходных данных.
На самом деле, '\ PN' является нечисловой символ в регулярном выражении; '\ D' - это то же самое, что и' [^ 0-9] ', или же то же, что и' \ P {Nd} 'под флагом компиляции' Pattern.UNICODE_CHARACTER_CLASS' от Java 7. BTW, ваш '' \ B «' отсутствует обратная косая черта, потому что Java не имеет регулярных выражений 1-го класса. Вы имели в виду '' \\ B "' - то есть '\ B' - для неграничного? Обратите внимание, что границы Java прерваны до Java 7. – tchrist
да, я имел в виду \\ B, это была опечатка. –