【问题标题】:Creating custom class with restrictions for number & letter value创建具有数字和字母值限制的自定义类
【发布时间】:2014-06-25 18:43:04
【问题描述】:

我想为“员工 ID 号”创建一个自定义类,但它需要以 ###-X 格式输出,其中三个数字中的每一个只能在 0-9 范围内,并且X 字母只能来自字母 A-M。

为了设置员工编号,我进行了这样的设置:

public void setEmployeeNumber(String num)
{
  if (validEmployeeNum(num))
  {
     employeeNumber = num;
  }
  else
  {
     employeeNumber = "";
  }
}

然后计划使用上面列出的约束创建一个布尔值“validEmployeeNum”,但我对如何实现这一点有点困惑。谁能帮助我创建一个布尔值,以便每个数字的###-X 只能在 0-9 范围内,并且字母只能来自字母 A-M?

有效输入示例:195-C

无效输入示例:99522-V

【问题讨论】:

  • 如何检查字符是否匹配?
  • 你可以使用正则表达式
  • 如果输入无效,我将抛出 IllegalArgumentException,我不会设置可能会或可能不会查看的布尔值。
  • 绝对是正则表达式的工作。
  • 正则表达式为[0-9]{3}-[A-M]

标签: java boolean


【解决方案1】:

regular expression 的经典应用程序用例。这里有一个味道:

import java.util.regex.*;

public class Match {

    static final Pattern pattern = Pattern.compile("^(\\d{3})-([A-M])$");

    static boolean isValid(String num) {
        return pattern.matcher(num).matches();
    }

    public static void main(String[] args) {
        for (String test : new String[] {
            "195-C",
            "1195-C",
            "195-Z"
        }) {
            System.out.println(test + " valid? " + isValid(test));
        }
    }
}

样本输出:

195-C valid? true
1195-C valid? false
195-Z valid? false

【讨论】:

    【解决方案2】:

    我会这样做:

    public Boolean validEmployeeNum(string num) { 
        if(num.length() != 5)
            return false;
    
        if('num.charAt(0)' >= 48 && 'num.charAt(0)' <= 57) {
            if('num.charAt(1)' >= 48 && 'num.charAt(1)' <= 57) {
                if('num.charAt(2)' >= 48 && 'num.charAt(2)' <= 57) {
                    if('num.charAt(4)' >= 65 && 'num.charAt(4)' <= 77) {
                        return true;
                   }
               }
           }
       }
    
       return false;
    } 
    

    当然这是假设每个员工编号都是一个长度为 5 个字符的字符串。

    【讨论】:

    • 我会使用像 '9''A' 这样的字符文字,而不是使用幻数。但话又说回来,正则表达式在这项工作中比字符到字符的比较更有效。
    • 正则表达式的效率要高得多,但对于以前可能没有这方面经验的人来说,可能会发现这更容易理解。
    【解决方案3】:

    您正在寻找使用Regex 来查看字符串matches 是否是您提供的正则表达式。

    ^([0-9]{3})-([A-M])
    

    将匹配您正在寻找的内容。展示了一个演示here

    【讨论】:

    • 您还可以添加一个插入符号以不匹配额外的数字,例如“11195-C”:regexr.com/392a2
    • 那个网站似乎不想接受美元符号?我试图让它最后也不接受额外的垃圾。
    • 我相信他们将/g 隐含在他们的代码库中。它不接受我额外的东西。
    • 哦,它会尝试将正则表达式与示例文本的全部内容进行匹配,作为一个输入。所以添加 $ 仅在这种情况下有效:regexr.com/392bo
    • 好发现,我不知道 Regexr 中有这个功能。
    【解决方案4】:

    按照评论者的建议使用正则表达式(顺便说一句,这是一个非常好的建议)或执行以下操作:

    public static boolean validateNumber(String empNum)  
    {  
       if(empNum.length() == 5)  
       {  
          char char1 = empNum.charAt(0);  
          char char2 = empNum.charAt(1);  
          char char3 = empNum.charAt(2);  
          char char4 = empNum.charAt(3);  
          char char5 = empNum.charAt(4);  
    
          if(char1 >= '0' && char1 <= '9')
          {
             if(char2 >= '0' && char2 <= '9')
             {
                if(char3 >= '0' && char3 <= '9')
                {
                   if(char4 == '-')
                   {
                      if(char5 >= 'A' && char5 <= 'M')
                      {
                         return true;
                      }
                   }
                }
             }
          }
       }
       return false;
    }
    

    我的朋友,这绝对不比正则表达式更可取,但它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2020-11-20
      • 1970-01-01
      • 2019-01-16
      相关资源
      最近更新 更多