34

我正在制作一个简单的程序,该程序将处理方程的字符串输入中的方程,但是,当我运行它时,由于尝试将“+”替换为“+”,所以我可以拆分字符串在空间。我应该如何使用

替换这些特殊字符的字符串replaceAll方法?下面是我的代码

线程“主”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);
4

4 回答 4

56

replaceAll接受一个正则表达式作为它的第一个参数。

+是一个特殊字符,它表示一个量词,意思是一个或多个出现。因此它应该被转义以指定文字字符+

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

(字符串是不可变的,因此有必要将变量分配给 的结果replaceAll);

对此的替代方法是使用删除元字符状态的字符类:

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

最简单的解决方案是使用replace使用非正则表达式String文字的方法:

rightside = rightside.replace("+", " +"); 
于 2013-04-25T14:36:08.983 回答
2

我有类似的问题regex = "?"。它发生在所有在正则表达式中具有某些含义的特殊字符上。因此,您需要将其"\\"作为正则表达式的前缀。

rightside = rightside.replaceAll("\\+", " +");
于 2014-05-26T06:48:56.777 回答
1

String#replaceAll期望regex作为输入,并且+不是正确的模式,\\+将是模式。rightside.replaceAll("\\+", " +");

于 2013-04-25T14:36:57.063 回答
0

这背后的原因是 - 正则表达式有保留字符。因此,当您使用 java split() 方法拆分它们时,您必须将它们与转义一起使用。例如,您想按 + 或 * 或 dot(.) 分割,那么您必须根据需要将其作为 split("\+") 或 split("\*") 或 split("\.") .

我对正则表达式的长期解释背后的原因是 -

你也可能在其他地方面临它。

例如,如果您使用 java 的 replace 或 replaceAll 方法,也会出现同样的问题,因为它们也基于正则表达式工作。

于 2021-02-03T16:30:04.740 回答