我试图提高我的正则表达能力,所以我已经制作了一个基本的计算器来练习模式匹配。系统会提示用户在控制台中输入两个整数值,以逗号分隔,不带空格。我并不担心int值太大而无法处理,我只想介绍用户输入-0的情况。应接受正0和所有其他负值和正值。
扫描程序对象获取用户的输入并将其存储在字符串变量中。然后将此变量传递给一个带有Pattern和Matcher的方法,该方法执行匹配并返回是否匹配的布尔值。
String userInput = scanner.next();
//look for only integers, especially excluding -0
if(checkUserMathInputIsGood("REGEX", userInput))
{
int sum;
String[] twoNumbersToAdd = userInput.split(",");
sum = Integer.parseInt(twoNumbersToAdd[0]) + Integer.parseInt(twoNumbersToAdd[1]);
System.out.println(sum);
}
经过几个小时的淘汰stackoverflow,javadocs等,我发现了一些几乎可行的解决方案。
http://www.vogella.com/tutorials/JavaRegularExpressions/article.html#regex_negative
http://www.regexplanet.com/advanced/java/index.html
Java regular expression for negative numbers?
以" T(blah blah)"开头的模式示例根本没有工作,我无法找到T应该完成的内容。我已接近:
"-{0,1}(?!0)\\d+,-{0,1}(?!0)\\d+"
打破它,这似乎说:允许减号最小为0,最多为1次。如果所谓的"否定前瞻"减号是真的。然后允许任何整数值至少为一个整数。但是,这会导致正则表达式拒绝0以及-0。
应接受的输入示例:
2,3
22,-4
-555,-9
0,88
0,0
应拒绝的输入示例:
-0,9
432,-0
-0,-0
非常感谢任何帮助或建议。
答案 0 :(得分:0)
如果我正确理解了要求,那么它应该是"-?\\d+,-?\\d+"
答案 1 :(得分:0)
^(?:(?:\+?\d+)|(?:-(?!0*,)\d+)),(?:(?:\+?\d+)|(?:-(?!0*$)\d+))$
说明:
^// match start of line or text
(?:// match either:
(?:// option 1:
\+? // a "+" if possible
\d+ // and any number of digits
)
|// or
(?:// option 2:
- // a "-" sign
(?!//negative lookahead assertion: do NOT match if next is...
0*,//...any number of zeroes and a comma
)
\d+//if we've made it this far, then we know this integer is NOT zero. Match any number of digits.
)
)
,// a comma.
(?:// this pattern is basically the same as the one for the first number.
(?:
\+?
\d+
)
|
(?:
-
(?!
0*$// except this matches the end of a line or text instead of a comma.
)
\d+
)
)
$// end of line or text.