1

中置式が入力されたときに操作の順序に従うことができる Java プログラムを作成しようとしています。入力を簡素化するために、式を使用して文字列全体を分割するのが最善であると判断しましたregex。を除くすべてを配列内の6 3独自のString値に分割できました。splitLineこれに対する私の SSCCE の試みは次のとおりです。

    String line = "6 + 5 + 6  3 + 18";
    String regex = "(?<=[-+*/()])|(?=[-+*/()])";   //Not spitting 6 3 correctly
    String[] splitLine = line.split(regex);
    for (int i=0; i<splitLine.length; i++) {
        System.out.println(splitLine[i]);
    }

出力:

6
+
5
+
6  3 //Error here
+
18

期待される出力:

6
+
5
+
6    //Notice
3    //these
+
18

正規表現を変更しようと試みましたが、失敗しました。私の正規表現が配列内で63を独自のものに分割しない理由を誰か教えてもらえますか?StringssplitLine

編集:私はこれを楽しみのためにやっているだけで、学校の仕事などのためではないことを指摘したかっただけです.単純な中置式を実行するプログラムを書くことができるかどうかを見たかっただけです. これを行うためのより良い方法があることに同意します。式がより複雑になると、何らかの問題が発生します。しかし、残念ながら、これが私の本が推奨する方法で、このステップにアプローチします。

迅速なコメントと回答をありがとうございます。

4

3 に答える 3

1

多分そのようなものを使用できますか?

String line = "6 + 5 + 6  3 + 18";
String regex = "(?<=[-+*/() ])|(?=[-+*/() ])";   //Added space to character class
String[] splitLine = line.split(regex);
for (int i=0; i<splitLine.length; i++) {
    if (splitLine[i].trim().equals("")) // Check for blank elements
        continue;
    System.out.println(splitLine[i].trim());
}

または、文字列を分割し(?<=\\d)\\s+(?=\\d)て get6 + 5 + 63 + 18.

于 2013-09-30T05:21:59.510 に答える
1

これを試して :(?<=[-+*/()])|(?=[-+*/()]|\\s{2,})

正規表現にスペースを追加してみてください。これは、2 つ以上のスペースがある場合にも分割されます。この場合、6 と 3 がスペースで区切られているため、スペース6 3も区切られます。この正規表現は、3 つ以上のスペースが一致した場合に文字列を吐き出します。\s{min,}正規表現のように最小スペース数を変更できます

于 2013-09-30T05:18:56.227 に答える
1

次の正規表現は、現在の入力と一致します。

\s(\w+|[-+*/()])

要点は、リストから単語または特定の文字が続く空白を検索することです。

出力

 6
 +
 5
 +
 6
 3
 +
 18
于 2013-09-30T05:19:54.073 に答える