2012-07-24 120 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+"