1

私は次のコードを持っています:

Pattern pattern = Pattern.compile("\\d+(?:\\.\\d+)?(\\s\\d+(?:\\.\\d+)?)*\\s*[-\\+\\*/\\$£]");

String input = "4.0 5.0 2.0 / + 7.0 - 11.0 34.0 2.0 / 3.0 / 1.0 * +";
Matcher matcher = pattern.matcher(input);
List<String> output = new ArrayList<>();
while (matcher.find()) {
    output.add(matcher.group());
}

コンパイルされたパターンは、多くの反復を経ており、現在の反復では、次のリストに追加されています。

[4.0 5.0 2.0 /, 7.0 -, 11.0 34.0 2.0 /, 3.0 /, 1.0 *]

すべての操作で分割し、操作を分割文字列に保持する必要があるため、次の出力が期待されます。

[4.0 5.0 2.0 /,+, 7.0 -, 11.0 34.0 2.0 /, 3.0 /, 1.0 *, +]

数値ではなく演算子のみが見つかった場合、分割されていないようです。

したがって、基本的には、現在の動作と、2 つの演算子が連続して見つかった場合にそれらを分割するような分割演算子が必要です。次のように:

2 2 + / 3 +

等しいだろう

[2 2 +, /, 3 +]
4

2 に答える 2

0

次の正規表現を使用できます。

((?:\d+(?:\.\d+)?(?:\s+\d+(?:\.\d+)?)*)?\s*[-+*/$£])

正規表現のデモ

Java では次のようになります。

Pattern pattern = Pattern.compile
  ( "((?:\\d+(?:\\.\\d+)?(?:\\s+\\d+(?:\\.\\d+)?)*)?\\s*[-+*/$£])" );
于 2014-12-22T14:38:43.837 に答える
0

多分私は何かが欠けているかもしれませんが、あなたの説明から、なぜそれほど複雑にする必要があるのか​​ わかりません。"[\\d. ]+?[-+/*£$]"あなたが望むことを正確に行うようです。

于 2014-12-22T14:39:21.620 に答える