【问题标题】:Validating String While Loop java No Regex在循环java没有正则表达式时验证字符串
【发布时间】:2017-06-22 21:17:57
【问题描述】:

基本上,我试图让一些 while 循环检查字符串中的特定索引。验证 refNum 长度的第一个循环工作正常。当它到达更大的 while 循环集时,它只是跳过它,我不确定为什么,任何反馈将不胜感激。

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();                    
                  }
              }
        }

【问题讨论】:

  • 那些内部循环看起来并不好。假设第一个条件为真,而内部条件为假。 userInput.nezt() 永远不会被调用。你跟着我吗?
  • 为什么不能使用正则表达式?他们来这里是有原因的。
  • 我上的课程想教java的基础,所以他们直到第二年才教我们正则表达式。

标签: java while-loop


【解决方案1】:

您的while 条件全部错误。 !(refNum.charAt(0) &gt;= 'A') &amp;&amp; !(refNum.charAt(0) &lt;= '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();
        }
    }
}

【讨论】:

    【解决方案2】:

    第一个!(A &gt;= B) 等价于(A &lt; B)。所以!(refNum.charAt(0) &gt;= 'A') &amp;&amp; !(refNum.charAt(0) &lt;= 'Z') 等价于(refNum.charAt(0) &lt; 'A') &amp;&amp; (refNum.charAt(0) &gt; 'Z')

    如果您查看 ASCII table,您会发现“小于 A 和大于 Z”是互斥条件。它们永远不会同时为真,因此 while 循环最终简化为 while(false)

    【讨论】:

      【解决方案3】:

      您的条件while(!refNum.charAt(0) &gt;= 'A') &amp;&amp; !(refNum.charAt(0) &lt;= 'Z')) 始终为假,因为一个字符不能同时小于'A' 和大于'Z'。使用 || 而不是 &amp;&amp; 就可以了。

      我会推荐使用

      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.
      

      更简单易读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-30
        • 2020-09-16
        • 2013-02-09
        • 2018-10-10
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        相关资源
        最近更新 更多