Java正则表达式匹配来自用户输入的整数

时间:2014-09-20 03:01:23

标签: java regex

我试图提高我的正则表达能力,所以我已经制作了一个基本的计算器来练习模式匹配。系统会提示用户在控制台中输入两个整数值,以逗号分隔,不带空格。我并不担心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

非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了要求,那么它应该是"-?\\d+,-?\\d+"

答案 1 :(得分:0)

^(?:(?:\+?\d+)|(?:-(?!0*,)\d+)),(?:(?:\+?\d+)|(?:-(?!0*$)\d+))$

Demo.

说明:

^// 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.