web-dev-qa-db-ja.com

メタ文字での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);
32
apache

replaceAll は、最初の引数として正規表現を受け入れます。

+は、1回以上の出現を意味する量指定子を示す特殊文字です。したがって、リテラル文字+を指定するにはエスケープする必要があります。

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

(文字列は不変なので、変数をreplaceAllの結果に割り当てる必要があります);

これに代わる方法は、メタ文字のステータスを削除する 文字クラス を使用することです。

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

ただし、最も単純な解決策は、非正規表現replaceリテラルを使用する String メソッドを使用することです。

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

regex = "?"でも同様の問題が発生しました。正規表現で何らかの意味を持つすべての特殊文字で発生します。したがって、正規表現のプレフィックスとして"\\"が必要です。

rightside = rightside.replaceAll("\\+", " +");
3
Aniket Thakur

_String#replaceAll_は入力としてregexを期待し、_+_は適切なパターンではありません。_\\+_はパターンです。 rightside.replaceAll("\\+", " +");