我在这个论坛上搜索了很多帖子,令我惊讶的是,我还没有找到像我一样有问题的人。 我必须从控制台为字符串值创建一个简单的计算器。现在,我试图制作一些正则表达式来验证输入。 我的计算器必须接受运算符之间带空格的数字(只允许+和 - ),而不是数字之间有空格的数字,总结如下: 2 + 2 = 4是正确的,但是 2 2 + 2 - >这应该是一个错误,并通知控制台上的用户他在数字之间放置空格。
我想出了这个:
static String properExpression = "([0-9]+[+-]?)*[0-9]+$";
static String noInput = "";
static String numbersFollowedBySpace = "[0-9]+[\\s]+[0-9]";
static String numbersWithSpaces = "\\d+[+-]\\d+";
//I've tried also "[\\d\\s+\\d]";
void validateUserInput() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a calculation.");
input = sc.nextLine();
if(input.matches(properExpression)) {
calculator.calculate();
} else if(input.matches(noInput)) {
System.out.print(0);
} else if(input.matches(numbersFollowedBySpace)) {
input.replaceAll(" ", "");
calculator.calculate();
} else if(input.matches(numbersWithSpaces))
{
System.out.println("Check the numbers.
It seems that there is a space between the digits");
}
else System.out.println("sth else");
你能给我一个关于我应该使用的正则表达式的提示吗?
答案 0 :(得分:1)
要匹配完整的表达式,例如2+3=24
或6 - 4 = 2
,请使用正则表达式
^\d+\s*[+-]\s*\d+\s*=\s*\d+$
会做的。看example 1你可以玩的地方。
如果您想匹配2+3+4+5=14
等较长的表达式,则可以使用:
^\d+\s*([+-]\s*\d+\s*)+=\s*\d+$
说明:
^\d+ # first operand
\s* # 0 or more spaces
( # start repeating group
[+-]\s* # the operator (+/-) followed by 0 or more spaces
\d+\s* # 2nd (3rd,4th) operand followed by 0 or more spaces
)+ # end repeating group. Repeat 1 or more times.
=\s*\d+$ # equal sign, followed by 0 or more spaces and result.
现在,您可能希望接受类似2=2
的表达式作为有效表达式。在这种情况下,重复组可能不存在,因此将+
更改为*
:
^\d+\s*([+-]\s*\d+\s*)*=\s*\d+$
请查看example 2。
答案 1 :(得分:1)
尝试:
^(?:\d+\s*[+-])*\s*\d+$
说明:
^
和$
将正则表达式与整个字符串相匹配。\s*
以允许每个数字/运算符之间的空格。[0-9]
替换为\d
,只是为了简化它;两者是等价的。我有点不清楚你是否想允许/不允许在最后包括= <digits>
,因为你的问题提到了这一点,但你尝试的properExpression
表达式没有尝试它。如果是这种情况,那么应该很容易看出如何修改表达式来支持它。
答案 2 :(得分:0)
请注意,我没有尝试解决除正则表达式问题之外的任何其他问题。 尽可能多地尝试保持逻辑流程。虽然还有其他更有效的答案,但您可能会改变您的逻辑流程。
如果您有任何疑问,请参阅以下内容并告知我们。
static String properExpression = "\\s*(\\d+\\s*[+-]\\s*)*\\d+\\s*";
static String noInput = "";
static String numbersWithSpaces = ".*\\d[\\s]+\\d.*";
//I've tried also "[\\d\\s+\\d]";
static void validateUserInput() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a calculation.");
String input = sc.nextLine();
if(input.matches(properExpression)) {
input=input.replaceAll(" ", ""); //You've to assign it back to input.
calculator.calculate(); //Hope you have a way to pass input to calculator object
} else if(input.matches(noInput)) {
System.out.print(0);
} else if(input.matches(numbersWithSpaces)) {
System.out.println("Check the numbers. It seems that there is a space between the digits");
} else
System.out.println("sth else");
示例工作版here
<强>解释强>
以下允许可更换空间..
\\s* //Allow any optional leading spaces if any
( //Start number+operator sequence
\\d+ //Number
\\s* //Optional space
[+-] //Operator
\\s* //Optional space after operator
)* //End number+operator sequence(repeated)
\\d+ //Last number in expression
\\s* //Allow any optional space.
带空格的数字
.* //Any beginning expression
\\d //Digit
[\\s]+ //Followed by one or more spaces
\\d //Followed by another digit
.* //Rest of the expression