java.util.regex.PatternSyntaxException: Dangling meta character '+' near index 0 +
JavaRegexJava Problem Overview
I am getting the error when I launch my UI that causes this code to spit the error at me in the title. It works for all of my other operator symbols so I am really not sure what's going on here. I didn't want to post all the code so you can find the rest if this isn't enough on my gitHub: https://github.com/jparr721/Calculator-App/tree/master/src/calculator
public class Calculation_Controls {
public double A, B;
private String[] operators = new String[] {"-","+","/","*","x","^","X"};
/**
* Check for the symbol being used within the TextArea to then
* apply the correct caculation method.
* FIXME - Allow for multiple symbols to be used and have them return
* FIXME - a result in accordance with PEMDAS
*
*@param nums
*
* @return operator, or error
*/
public String findSymbol(String nums) {
for (String operator : operators) {
if (nums.contains(operator)) {
return operator;
}
}
return "invalid input";
}
/**
* Input method to take the user input from the text area
* and apply the correct calculation to it
*
* @param nums - Stores the input as a String which I then convert to an int
* then back to a string to be printed to the TextArea
*
* @return - The result of the calculation as a string
*/
public String input(String nums){
String operator = findSymbol(nums);
if (operator == null){
System.out.println("Invalid input");
}
String[] split = nums.split(operator);
int left = Integer.parseInt(split[0]);
int right = Integer.parseInt((split[1]));
String result = "";
switch (operator){
case "+":
result = Double.toString(add(left, right));
break;
case "-":
result = Double.toString(subtract(left, right));
break;
case "*":
case "x":
case "X":
result = Double.toString(multiply(left, right));
break;
case "/":
result = Double.toString(divide(left, right));
break;
case "^":
result = Double.toString(pwr(left, right));
break;
default:
System.out.println("Invalid Operator");
}
return result;
}
Java Solutions
Solution 1 - Java
There are reserved character in Regex and you should scape these character to achieve what you want. For example, you can't use String.split("+")
, you have to use String.split("\\+")
.
The correct operators would be:
String[] operators = new String[] {"-","\\+","/","\\*","x","\\^","X"};
Solution 2 - Java
in your case +
*
and ^
are treated with a special meaning, most often called as Metacharacters. String.split()
method takes a regex expression as its argument and return a String
array. To avoid treating above as a Metacharacters you need to use these escape sequences in your code "\\+"
"\\*"
"\\^"
modify your operator array like this
private String[] operators = new String[] {"-","\\+","/","\\*","x","\\^","X"};
for more detalis refere these links regex.Pattern and String.split()
Solution 3 - Java
you can use case String.valueOf('+');
Solution 4 - Java
Change: String[] split = nums.split(operator);
To this: String[] split = nums.split("\\" + operator);
edit: This will only work for standard operators, not the x or X. You'll have to change your String[] operators
declaration actually, like the other answer mentioned. Personally though, I'd do some kind of input validation and do a replace() on x
or X
to be *
instead
Solution 5 - Java
the split() method uses regex. the '+' symbol is a special character in regex, so you need to escape it with the backslash symbol (''). But you also need to escape the backslash symbol in java, so you need two backslashes, e.g. "\\+"