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);
Ответы
Ответ 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("\\+", " +");