2012-07-24 121 views
5

我是java正则表达式的新手。我写了下面的代码来验证非数字号码。如果我们输入任何非数字号码,它应该返回false。对于我下面的代码总是返回false。这里有什么错误?java正则表达式返回false

包正则表达式;

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class NumberValidator { 

    private static final String NUMBER_PATTERN = "\\d"; 
    Pattern pattern; 

    public NumberValidator() { 
     pattern = Pattern.compile(NUMBER_PATTERN); 
    } 

    public boolean validate(String line){ 
     Matcher matcher = pattern.matcher(line); 
     return matcher.matches(); 
    } 

    public static void main(String[] args) { 

     NumberValidator validator = new NumberValidator(); 

     boolean validate = validator.validate("123"); 

     System.out.println("validate:: "+validate); 
    } 

} 
+0

你真的需要一个类? '“123”.matches(“\\ d +”)'是不够的? – elias 2012-07-24 17:25:06

+0

Yaa ..这是真的。即使这条线它确实工作。感谢您简化代码.. – user414967 2012-07-25 05:41:16

回答

10

从Java文档:

的比赛方法试图匹配针对图案的整个输入序列。

你的正则表达式匹配一个数字,而不是数字。添加+\\d后matchone或多个数字:

private static final String NUMBER_PATTERN = "\\d+"; 

作为一个侧面说明,你可以结合初始化和模式的声明,使得构造不必要的:

Pattern pattern = Pattern.compile(NUMBER_PATTERN); 
+0

这并不能解释为什么结果是'false'。 '“\\ d”'也匹配'“123”'。 (另外,如果模式应该*只匹配数字,则应该是'“^ \\ d + $”'。) – Tomalak 2012-07-24 16:30:30

+1

@Tomalak感谢您的提示 - 我添加了一个解释。 – dasblinkenlight 2012-07-24 16:32:08

+0

啊,我明白为什么在这里不需要'^'和'$'。谢谢。 – Tomalak 2012-07-24 16:58:20

2

matches“如果返回true,只有当整个区域序列匹配这个匹配器的模式时。“

该字符串是3位,其不匹配的模式\d,意思是“一个数字”。

相反,你想要的模式\d+,意思是“一个或多个数字。”这是表示为一个字符串为"\\d+"