Подтвердить что ты не робот

String.split() в метасимволе +

Я делаю простую программу, которая будет обрабатывать уравнения из строкового ввода уравнения Однако, когда я запускаю его, я получаю исключение из-за попытки заменить "+" на "+", поэтому я могу разделить строку на пробелы. Как мне следует использовать

метод replaceAll для замены этих специальных символов? Ниже мой код

Исключение в потоке "main" java.util.regex.PatternSyntaxException: Висячий метасимвол '+' рядом с индексом 0 + ^

 public static void parse(String x){
       String z = "x^2+2=2x-1";

       String[] lrside =  z.split("=",4);
       System.out.println("Left side: " + lrside[0] + " / Right Side: " + lrside[1]);
       String rightside = lrside[0];
       String leftside = lrside[1];

       rightside.replaceAll("-", " -");
       rightside.replaceAll("+", " +");
       leftside.replaceAll("-", " -"); leftside.replaceAll("+", " +");
       List<String> rightt = Arrays.asList(rightside.split(" "));
       List<String> leftt = Arrays.asList(leftside.split(" "));

       System.out.println(leftt);
       System.out.println(rightt);
4b9b3361

Ответ 1

replaceAll принимает регулярное выражение в качестве своего первого аргумента.

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

rightside = rightside.replaceAll("\\+", " +");

(Строки неизменяемы, поэтому необходимо присвоить переменную результат replaceAll);

Альтернативой этому является использование символьного класса который удаляет статус метасимвола:

rightside = rightside.replaceAll("[+]", " +");

Простейшим решением было бы использовать метод replace, который использует литералы non-regex String:

rightside = rightside.replace("+", " +"); 

Ответ 2

У меня была аналогичная проблема с regex = "?". Это происходит для всех специальных символов, которые имеют некоторое значение в регулярном выражении. Поэтому вам нужно иметь "\\" в качестве префикса для вашего регулярного выражения.

rightside = rightside.replaceAll("\\+", " +");

Ответ 3

String#replaceAll ожидает regex как входной, а + не является правильным шаблоном, \\+ будет шаблоном. rightside.replaceAll("\\+", " +");