Java 未知方程的正则表达式
Java Regular Expressions for unknown equation
我正在尝试使用单行,没有 space 方程作为输入,但我是正则表达式的新手。我知道我代码中的正则表达式是完全错误的,但这是解释我正在尝试做的事情的最佳方式。一些示例情况是 12+2=14、-4+54=50、5*8=40、8--2=10、2-4=-6 等。如果有人能告诉我,我也将不胜感激如何在正则表达式中使用 OR,因为我找不到任何信息。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
String re1="((-)(\d+))|(\d+)"; // -int1 or int1
String re2="((\+) | - | (\*))"; //+ or - or *
String re3="((-)(\d+))|(\d+)"; // -int2 or int2
String re4="(=)"; // Equals
String re5="((-)(\d+))|(\d+)"; // -int3 or int3
Pattern pattern = Pattern.compile(re1+re2+re3+re4+re5,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
String int1 = matcher.group(2);
String op1 = matcher.group(3);
String int2 = matcher.group(4);
String op2 = matcher.group(5);
String int3 = matcher.group(6);
System.out.println(int1 + " " + op2 + " " + int2 + " " + op2 + " " + int3);
}
}
首先,我建议使用像 http://www.regexr.com/ 这样的网站来实时测试您的正则表达式。
然后,您可以使用可选量词代替 "OR",例如([-]?\d+)
匹配任何负数和正数:
[-]
是一个包含负号的集合,后面的?
表示这个集合可以出现0次或一次(这就是为什么它被称为可选量词),然后\d+
表示一个数字出现一次或更多次。
要指定运算符,您可以使用集合 [+\-*\/]
。请注意,在这种情况下,-
必须由 \
转义,因为通常在 [a-n]
这样的集合中找到它代表 a
和 n
之间的范围.但在我们的例子中,它只是一组的一部分。
所以,把这两个部分结合起来,你可以得到一个像这样的正则表达式:([-]?\d+)([+\-*/])([-]?\d+)=([-]?\d+)
请注意,您必须在 Java 字符串中对 \
进行转义(我在这里没有这样做,因为它主要是关于正则表达式)。
我正在尝试使用单行,没有 space 方程作为输入,但我是正则表达式的新手。我知道我代码中的正则表达式是完全错误的,但这是解释我正在尝试做的事情的最佳方式。一些示例情况是 12+2=14、-4+54=50、5*8=40、8--2=10、2-4=-6 等。如果有人能告诉我,我也将不胜感激如何在正则表达式中使用 OR,因为我找不到任何信息。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.next();
String re1="((-)(\d+))|(\d+)"; // -int1 or int1
String re2="((\+) | - | (\*))"; //+ or - or *
String re3="((-)(\d+))|(\d+)"; // -int2 or int2
String re4="(=)"; // Equals
String re5="((-)(\d+))|(\d+)"; // -int3 or int3
Pattern pattern = Pattern.compile(re1+re2+re3+re4+re5,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
String int1 = matcher.group(2);
String op1 = matcher.group(3);
String int2 = matcher.group(4);
String op2 = matcher.group(5);
String int3 = matcher.group(6);
System.out.println(int1 + " " + op2 + " " + int2 + " " + op2 + " " + int3);
}
}
首先,我建议使用像 http://www.regexr.com/ 这样的网站来实时测试您的正则表达式。
然后,您可以使用可选量词代替 "OR",例如([-]?\d+)
匹配任何负数和正数:
[-]
是一个包含负号的集合,后面的?
表示这个集合可以出现0次或一次(这就是为什么它被称为可选量词),然后\d+
表示一个数字出现一次或更多次。
要指定运算符,您可以使用集合 [+\-*\/]
。请注意,在这种情况下,-
必须由 \
转义,因为通常在 [a-n]
这样的集合中找到它代表 a
和 n
之间的范围.但在我们的例子中,它只是一组的一部分。
所以,把这两个部分结合起来,你可以得到一个像这样的正则表达式:([-]?\d+)([+\-*/])([-]?\d+)=([-]?\d+)
请注意,您必须在 Java 字符串中对 \
进行转义(我在这里没有这样做,因为它主要是关于正则表达式)。