java - 正则表达式不将元素存储在第一个索引中

标签 java regex

我有一个函数,它接受一个包含数学表达式(例如 6+9*84+9)的字符串,并从左到右对它们进行计算(没有正常的操作顺序规则)。

过去几个小时我一直被这个问题困扰,终于找到了罪魁祸首,但我不知道为什么它会这样做。当我通过正则表达式(.split("\\d").split("\\D"))分割字符串时,我将其放入 2 个数组中,一个是 int[],其中包含表达式中涉及的数字,另一个是 String[],其中包含运算。

当我执行以下操作时,我意识到:

String question = "5+9*8";
String[] mathOperations = question.split("\\d");
for(int i = 0; i < mathOperations.length; i++) {
    System.out.println("Math Operation at " + i + " is " + mathOperations[i]);
}

它不会将第一个操作符号放在索引 0 中,而是将其放在索引 1 中。这是为什么? 这是控制台上的 system.out:

Math Operation at 0 is 
Math Operation at 1 is +
Math Operation at 2 is *

最佳答案

因为在 mathOperations 的位置 0 上有一个空字符串。换句话说

mathOperations = {"", "+", "*"};

根据分割documentation

The array returned by this method contains each substring of this string that is terminated by another substring that matches the given expression or is terminated by the end of the string. ...

为什么数组末尾没有空字符串?

Trailing empty strings are therefore not included in the resulting array.

更详细的解释 - 您的正则表达式与字符串匹配,如下所示:

"(5)+(9)*(8)" -> "" + (5) + "+" + (9) + "*" + (8) + ""

但尾随空字符串将按照文档的指定被丢弃。 (希望这个愚蠢的插图有帮助)

另外值得注意的是,您使用的正则表达式 "\\d" 会将以下字符串 "55+5" 拆分为

["", "", "+"]

那是因为您只匹配单个字符,您可能应该使用 "\\d+"

关于java - 正则表达式不将元素存储在第一个索引中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35280125/

相关文章:

java - java中日期格式的转换方法

java - 最近有关 JVM 的书籍?

PHP 从 url 获取版本

正则表达式帮助,基于字符串末尾第 n 次出现的子集

python - 在 Python 中以特定模式打印字母

java - 从 JInternalFrame 调用 JFrame 的方法?

java.lang.IllegalArgumentException : string curve25519 not an OID bouncycaSTLe 1. 52

java - 如何在 JPanel 上创建新 Canvas ?

regex - Elasticsearch 删除特殊字符(来自非基于 ascii 的语言)

c# - 在 C# 中使用正则表达式匹配 a^n b^n c^n (例如 “aaabbbccc” )