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 回答