2014-07-06 76 views
0

我想在while循環中使用正則表達式驗證用戶輸入。我只想接受一個小寫字母(包括字母a-z)。在Java中的正則表達式:驗證用戶輸入

public class testRedex{ 

    public static void main(String [] args){  
     Scanner console = new Scanner(System.in);  
     System.out.print("Please enter a key: ");  
     while(!console.hasNext("[a-z]+")){     
       System.out.println("Invalid key");    
       console.next();   
     } 

     String test = console.next();   
     System.out.println(test);   
    } 
} 

我的問題是,是否有具有正則表達式爲 「[A-Z] +」 和 「[A-Z] + $」 之間的任何差異?我知道$會在字符串末尾的a-z之間尋找一個字符,但是在這種情況下它會起作用嗎?

+0

給接受輸入的樣本。 –

+0

一些例子是像「貓,魚,狗,sjakjsdljasmx,五,regularexpresson等」。 – user3808889

回答

1

有是有區別的,如果你使用:^[a-z]+$這意味着,無論用戶輸入應該只從[a-z]+結合。

如果不加^$用戶可以插入其他字符,例如空間,仍然會有一個匹配(字符串,直至空間的第一部分。

讓我們來看看一個例子:

  • 運行與輸入代碼:「試試這個」(它會打印出「嘗試」)
  • 現在正則表達式更改爲^[a-z]+$並運行相同的輸入(它會打印出「無效密鑰「)。

我會重新寫它的方式是:

System.out.print("Please enter a key: "); 

    String test = console.nextLine(); 
    while (!test.matches("^[a-z]+$")) { 
     System.out.println("Invalid key"); 
     test = console.nextLine(); 
    } 
    System.out.println(test); 
+0

@alfasin好的,謝謝你的更新。你知道爲什麼hasNext()方法無法正常使用正則表達式「^ [a-z] + $」嗎? – user3808889

+0

@ user3808889這並不是說它不能和正則表達式一起工作:在最初版本中,hasNext()是在調用nextLine()(在循環結尾)之後使用的,並且導致了混亂。 – alfasin

0

的區別如下

[a-z]+指,B,C,...,或Z中出現超過一次時

[a-z]+$指,B,C,...,或Z發生更多的一次,必須匹配行末

然而,在最後,他們給你結果相同

,如果你想更好地瞭解它試試這個

([A-Z])([a-z]+$) 

它開始以大寫字母和一個以上的時間小寫字母

輸出端:

Please enter a key: AAAAaaaa 
Invalid key 
Aaaaaa 
Aaaaaa 

另一種方式你可以從你正在尋找的東西中得到預期的結果

代碼:

int i = 0; 
    String result = ""; 
    do{ 
    Scanner input = new Scanner(System.in); 
    System.out.println("Enter your key:"); 

    if(input.hasNext("^[a-z]+$")){ 
     result = input.next(); 
     i=1; 
    }else{ 
     System.out.println("Invalid key"); 
    } 
    }while(i==0); 
    System.out.println("the result is " + result); 

輸出:

Enter your key: 
HHHh 
Invalid key 
Enter your key: 
Hellllo 
Invalid key 
Enter your key: 
hello 
the result is hello