为什么这个简单的正则表达式/扫描仪不起作用?

时间:2015-04-27 11:40:53

标签: java regex

我必须解决下一个练习:

创建一个键盘扫描程序,其中标记是无符号整数,并编写代码以确定整数的总和。

注意:-5将被扫描为无符号整数5,减号将作为分隔符跳过

这是我的解决方案(不工作):

   import java.util.*;

public class testing{

    public static void main( String[] argv ){

        testing p = new testing();
    }

    public testing(){

        Scanner myScanner = new Scanner(System.in);
        String regex = "\\s+|-";
        myScanner.useDelimiter(regex);

        int sum = 0;

        while(myScanner.hasNextInt()){

            int partial = myScanner.nextInt();
            sum += partial; 
        }

        System.out.println(sum); 
    }
}

我的解决方案的问题是它仅适用于正整数或负整数(仅第一个输入)添加到正整数。 例如:

-2
3
4
f (used to stop the program)

将检索9。 但是

3
-2

将停止程序并检索3

我试图了解这种行为的原因,但到目前为止还没有运气。

2 个答案:

答案 0 :(得分:5)

你正在使用正则表达式中的OR,这意味着它只消耗换行符然后停在&#39; - &#39;,因为它不再作为分隔符使用。< / p>

扫描仪看到的输入是:

  

-2 \ N3 \ N4 \ NF

&#39; F&#39;是一个整数之后的第一件事,它与你的空格模式 OR 一个减去。

第二种模式虽然要求两者与你的分隔符匹配:

  

3 \ N-2

因此,换行符(空格)与您的分隔符模式匹配,并且减号仍然无法匹配。因为它不是Integer .hasNextInt()返回false。

可重复的空格组和减号组按照您的意图运行:

final String regex = "[\\s-]+";

这可能最终会接受超出练习要求的内容,例如数字前面的多个减号。如果这是不可接受的,你当然可以在不确定数量的空格之后将负数限制为一次:

final String regex = "[\\s]*-?";

&#39;?&#39;意味着&#34;曾经或根本不是&#34;并限制了错误的发生。

编辑:

正如@maraca在评论中指出的那样,我之前提出的解决方案仅适用于单位数字,因为模式也接受空字符串。适用于数字&gt; 9的解决方案是:

final String regex = "\\s+|\\s*-";

它的作用是消耗一个或多个空格 OR 零个或多个空格后跟一个减号。

事实证明,像这样的小事情可能很难做到。 -.-

答案 1 :(得分:-1)

你可以通过这样捕捉InputMismatchException来解决:

public Testing(){

        Scanner myScanner = new Scanner(System.in);
        String regex = "\\s+|-";
        myScanner.useDelimiter(regex);

        int sum = 0;

        while(myScanner.hasNext()){
            int partial = 0;
            try{
                partial = myScanner.nextInt();
            } catch(InputMismatchException e){
                continue;
            }
            sum += partial; 
        }

        System.out.println(sum); 
}

问题是你正在尝试解析一个int,但是你收到了一个“ - ”。