寻找字符串的匹配项(显示计算器)
Looking for a match for a String (display calculator)
我正在 Java 制作一个计算器。问题是我试图找到一个匹配,给定一个字符串,只接受第二个操作数(操作可以是 +
、-
、*
和 /
) .
示例字符串输入:
21 + 574
573 * 1
89 - 4312
23 / 23
-1 + 4
-3 + 45
对应的字符串输出:
574
1
4312
23
4
45
有人知道 匹配 可以做到这一点吗?
正如我已经在您的 post 的评论部分中提供的那样,以下内容将拆分出您想要的值:
System.out.println("21 + 574".split("\s*(\+|\-|\*|\/)\s*")[1]);
这仅适用于无符号(正)数,因为减号 (-) 也用于负数的符号(例如 -574)。如果您还想处理负值,则需要对正则表达式稍作更改。我们需要在'-'字符后加一个空格,例如:
"\s*(\+|\- |\*|\/)\s*"
^
Space
这意味着,任何包含减法的方程式都必须在减号运算符后包含一个空格。如果等式如下:4 + -6
,这很有效。即使数字和运算符之间没有空格,这仍然没问题,例如:4+-6
。但是,如果前面方程中的运算符是减号运算符而不是加号运算符,则情况完全不同,例如:4--6
。该等式实际上会生成 ArrayIndexOutOfBoundsException。这显然不行。
为了解决这种特殊情况,我们需要将两个减号字符 (--
) 分开,为此我们可以使用 String#replace() 方法,例如:
System.out.println("4--6".replace("--", "- -").split("\s*(\+|\- |\*|\/)\s*")[1]);
这将输出:-6
.
总有一天(我敢肯定很快)即使这个或任何其他小捷径都不够好,您将需要实际解析方程式。圆括号和大括号在数学方程式中起着重要作用,您将需要一些东西来解析所有这些。对于这种事情,正则表达式可能不够好。
下面我提供了一种快速方法,可以将方程拆分为单独的组件,这些组件可能包含也可能不包含方括号、大括号、负数等。也许这可以用作创建您自己的方程解析器(或查找并利用已经开发的一个)。
/**
* This method will split a math equation string (even with various bracket
* types or nested brackets) into a String[] Array. Signed and unsigned
* integer or floating point values can be within the supplied mathematical
* equation.<br><br>
*
* Whitespaces are ignored during parsing and will not be contained within
* the returned String[] Array as an array element.<br>
*
* @param equation (String) The mathematical equation to parse into a
* String [] Array.<br>
*
* @return (Single Dimensional String[] Array)
*/
private String[] splitEquation(String equation) {
List<String> list = new ArrayList<>();
String number = "";
for (char c : equation.toCharArray()) {
if (c == ' ') {
if (!number.isEmpty()) {
list.add(number);
number = "";
}
}
else if (Character.isDigit(c) || c == '.' || (c == '-' && number.isEmpty())) {
number += Character.toString(c);
}
else if (!Character.isDigit(c) && !number.isEmpty()) {
list.add(number);
number = "";
list.add(Character.toString(c));
}
else {
list.add(Character.toString(c));
}
}
if (!number.isEmpty()) {
list.add(number);
}
return list.toArray(new String[list.size()]);
}
要使用此方法:
String[] parts = splitEquation("(4+(-3/2))");
System.out.println(Arrays.toString(parts));
控制台window将显示:
[(, 4, +, (, -3, /, 2, ), )]
我正在 Java 制作一个计算器。问题是我试图找到一个匹配,给定一个字符串,只接受第二个操作数(操作可以是 +
、-
、*
和 /
) .
示例字符串输入:
21 + 574
573 * 1
89 - 4312
23 / 23
-1 + 4
-3 + 45
对应的字符串输出:
574
1
4312
23
4
45
有人知道 匹配 可以做到这一点吗?
正如我已经在您的 post 的评论部分中提供的那样,以下内容将拆分出您想要的值:
System.out.println("21 + 574".split("\s*(\+|\-|\*|\/)\s*")[1]);
这仅适用于无符号(正)数,因为减号 (-) 也用于负数的符号(例如 -574)。如果您还想处理负值,则需要对正则表达式稍作更改。我们需要在'-'字符后加一个空格,例如:
"\s*(\+|\- |\*|\/)\s*"
^
Space
这意味着,任何包含减法的方程式都必须在减号运算符后包含一个空格。如果等式如下:4 + -6
,这很有效。即使数字和运算符之间没有空格,这仍然没问题,例如:4+-6
。但是,如果前面方程中的运算符是减号运算符而不是加号运算符,则情况完全不同,例如:4--6
。该等式实际上会生成 ArrayIndexOutOfBoundsException。这显然不行。
为了解决这种特殊情况,我们需要将两个减号字符 (--
) 分开,为此我们可以使用 String#replace() 方法,例如:
System.out.println("4--6".replace("--", "- -").split("\s*(\+|\- |\*|\/)\s*")[1]);
这将输出:-6
.
总有一天(我敢肯定很快)即使这个或任何其他小捷径都不够好,您将需要实际解析方程式。圆括号和大括号在数学方程式中起着重要作用,您将需要一些东西来解析所有这些。对于这种事情,正则表达式可能不够好。
下面我提供了一种快速方法,可以将方程拆分为单独的组件,这些组件可能包含也可能不包含方括号、大括号、负数等。也许这可以用作创建您自己的方程解析器(或查找并利用已经开发的一个)。
/**
* This method will split a math equation string (even with various bracket
* types or nested brackets) into a String[] Array. Signed and unsigned
* integer or floating point values can be within the supplied mathematical
* equation.<br><br>
*
* Whitespaces are ignored during parsing and will not be contained within
* the returned String[] Array as an array element.<br>
*
* @param equation (String) The mathematical equation to parse into a
* String [] Array.<br>
*
* @return (Single Dimensional String[] Array)
*/
private String[] splitEquation(String equation) {
List<String> list = new ArrayList<>();
String number = "";
for (char c : equation.toCharArray()) {
if (c == ' ') {
if (!number.isEmpty()) {
list.add(number);
number = "";
}
}
else if (Character.isDigit(c) || c == '.' || (c == '-' && number.isEmpty())) {
number += Character.toString(c);
}
else if (!Character.isDigit(c) && !number.isEmpty()) {
list.add(number);
number = "";
list.add(Character.toString(c));
}
else {
list.add(Character.toString(c));
}
}
if (!number.isEmpty()) {
list.add(number);
}
return list.toArray(new String[list.size()]);
}
要使用此方法:
String[] parts = splitEquation("(4+(-3/2))");
System.out.println(Arrays.toString(parts));
控制台window将显示:
[(, 4, +, (, -3, /, 2, ), )]