我正在尝试使用单行,没有空格方程作为输入,但我是regex的新手。我知道我的代码中的正则表达式是完全错误的,但它是解释我想要做的最好的方法。一些示例案例将是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);
}
}
答案 0 :(得分:1)
首先,我建议使用像http://www.regexr.com/这样的网站来测试您的正则表达式。
然后,而不是" OR"您可以使用可选的量词,例如([-]?\d+)
匹配任何负数和正数:
[-]
是包含减号的集合,以下?
表示集合可以出现零次或一次性(这就是为什么它被称为可选量词),然后\d+
表示发生一次或多次的数字。
要对运算符进行分类,您可以使用集合[+\-*\/]
。请注意,在这种情况下,-
必须由\
转义,因为通常在[a-n]
这样的集合中找到它时,它代表a
和n
之间的范围。但在我们的例子中,它只是一组的一部分。
所以,考虑到这两部分你最终会得到这样的正则表达式:([-]?\d+)([+\-*/])([-]?\d+)=([-]?\d+)
请注意,您必须在Java字符串中转义\
(我在这里没有做过,因为它主要是关于正则表达式)。