2017-06-22 89 views
0

基本上我試圖讓一些while循環檢查字符串中的特定索引。驗證refNum長度的第一個循環正常工作。當它到達更大的while循環時,它只是跳過它,我不知道爲什麼,任何反饋將不勝感激。驗證字符串while循環java沒有正則表達式

package testing_code; 
import java.util.Scanner; 

/** 
* 
* @author A.Con 
*/ 
public class Testing_Code 
{ 

    public static void main(String[] args) 
    { 
     Scanner userInput = new Scanner (System.in); 
     String refNum; 

     System.out.println("Enter refNum: example - WE123A"); 
     refNum = userInput.next(); 

     int rnLength = refNum.length(); 

     while(rnLength < 6 || rnLength > 6) 
     { 
      System.out.println("Invalid reference number. Try again.\n "); 
      System.out.println("Please enter reference No.: "); 
      refNum = userInput.next(); 
      rnLength = refNum.length(); 
     } 


     while(!(refNum.charAt(0) >= 'A') && !(refNum.charAt(0) <= 'Z') && !(refNum.charAt(1) >= 'A') && !(refNum.charAt(1) <= 'Z')) 
     { 
      while(!(refNum.charAt(2) >= '0') && !(refNum.charAt(2) <= '9') && !(refNum.charAt(3) >= '0') && !(refNum.charAt(3) <= '9')) 
       { 
        while(!(refNum.charAt(4) >= '0') && !(refNum.charAt(4) <= '9') && !(refNum.charAt(5) >= 'A') && !(refNum.charAt(5) <= 'Z')) 
        { 
       System.out.println("Invalid reference number. Try again.\n "); 
       System.out.println("Please enter reference No.: "); 
       refNum = userInput.next();      
        } 
       } 
     } 
+0

那些內環看起來並不WEEL版本。假設第一個條件爲真,而內部的條件爲假。 'userInput.nezt()'永遠不會被調用。你聽懂了嗎? – Pelocho

+1

爲什麼你不能使用正則表達式?他們在這裏有一個原因。 – Asew

+0

我正在上的課程想要教Java的基礎,所以他們不會教我們直到2年的正則表達式。 –

回答

0

您的while條件都是錯誤的。 !(refNum.charAt(0) >= 'A') && !(refNum.charAt(0) <= 'Z')例如檢查字符是否低於A高於Z,這是不可能的;您應該使用or來代替。

事實上,有一個很多你可以改善這種方式。這裏是我的

public class Testing_Code 
{ 
    static boolean inRange(char c, char first, char last) { 
     return (c >= first) && (c <= last); 
    } 

    public static void main(String[] args) 
    { 
     Scanner userInput = new Scanner (System.in); 
     String refNum; 

     System.out.println("Enter refNum: example - WE123A"); 
     refNum = userInput.next(); 

     while(refnum.length() != 6 
       || !inRange(refnum.charAt(0), 'A', 'Z') 
       || !inRange(refnum.charAt(1), 'A', 'Z') 
       || !inRange(refnum.charAt(2), '0', '9') 
       || !inRange(refnum.charAt(3), '0', '9') 
       || !inRange(refnum.charAt(4), '0', '9') 
       || !inRange(refnum.charAt(5), 'A', 'Z')) 
     { 
      System.out.println("Invalid reference number. Try again.\n "); 
      System.out.println("Please enter reference No.: "); 
      refNum = userInput.next(); 
      rnLength = refNum.length(); 
     } 
    } 
} 
0

首先!(A >= B)相當於(A < B)。所以!(refNum.charAt(0) >= 'A') && !(refNum.charAt(0) <= 'Z')相當於(refNum.charAt(0) < 'A') && (refNum.charAt(0) > 'Z')

如果你看看ASCII table,你會看到「小於A和大於Z」是互斥的條件。他們將永遠都在同一時間是真實的,那麼while循環結束了簡化到while(false)

0

你的條件while(!refNum.charAt(0) >= 'A') && !(refNum.charAt(0) <= 'Z'))永遠是假的,作爲一個字符不能小於'A'和大於'Z'在同一時間。使用||而不是&&,你很好。

我會建議使用

Character.isLetter(refNum.charAt(0)) // returns true if the passed character is a letter 
Character.isDigit(refNum.charAt(0)) // returns true, if the passed character is a digit. 

簡單多了&易於閱讀。