改进我的验证

时间:2015-03-12 14:58:44

标签: java performance validation

当用户输入他们的ID我希望它具有特定格式时,他们大多在评论中解释。我想知道他们是否更容易更有效地这样做。另外,是否有办法将输入的字母更改为我完成代码或任何其他方法的方式。

private boolean setCustomerID(String id) {
    //Validates the customerID contains 3 letters a hypthen then 4 numbers
    if ((id.charAt(0) < 'A' || id.charAt(0) > 'Z')
            || (id.charAt(1) < 'A' || id.charAt(1) > 'Z')
            || (id.charAt(2) < 'A' || id.charAt(2) > 'Z')
            || (id.charAt(3) != '-')
            || !isDigit(id.charAt(4))
            || !isDigit(id.charAt(5))
            || !isDigit(id.charAt(6))
            || !isDigit(id.charAt(7))) {
        return false;
        //Checks the user enters P, B or C for first letter
    } else if ((id.charAt(0) == 'P' || id.charAt(0) == 'B' || id.charAt(0) == 'E')
            //Checks the second and third letter are in the correct region
            && ((id.charAt(1) == 'S' && id.charAt(2) == 'C') 
            || (id.charAt(1) == 'S' && id.charAt(2) == 'C')
            || (id.charAt(1) == 'W' && id.charAt(2) == 'A')
            || (id.charAt(1) == 'N' && id.charAt(2) == 'I')    
            || (id.charAt(1) == 'N' && id.charAt(2) == 'E')    
            || (id.charAt(1) == 'N' && id.charAt(2) == 'W')    
            || (id.charAt(1) == 'M' && id.charAt(2) == 'I')    
            || (id.charAt(1) == 'E' && id.charAt(2) == 'A')    
            || (id.charAt(1) == 'S' && id.charAt(2) == 'E')
            || (id.charAt(1) == 'S' && id.charAt(2) == 'W'))){ 
        //    SC (Scotland), WA (Wales), NI (Northern Ireland), NE (North-East), NW (North-West),
        //MI (Midlands), EA (East Anglia), SE (South-East), SW (South-West).
        return true;
    }
        return false;
    }

3 个答案:

答案 0 :(得分:7)

使用正则表达式。

private boolean matchCustomerID(String id) {
    return id.matches("^[PBE](?:SC|WA|NI|NE|NW|MI|EA|SE|SW)-\\d{4}\\b");
}

答案 1 :(得分:2)

正则表达式是解决问题的一种方法。您可以通过使维护更容易的方式组合模式。在rcorreia's pattern的基础上,您可以执行以下操作:

private boolean setCustomerID(String id) {
  char[] validFirstLetters = { 'P', 'B', 'E' };
  String[] validRegions = { "SC", "WA", "NI", "NE", "NW", "MI", "EA", "SE", "SW" };

  String pattern =
      String.format("^[%s](?:%s)-\\d{4}$", new String(validFirstLetters),
          String.join("|", validRegions));

  return id.matches(pattern);
}

请注意,它使用Java 8中的String.join()。如果您还没有使用Java 8,请考虑使用Apache Commons Lang中的StringUtils

答案 2 :(得分:0)

Regexp是一个很棒的功能,但不容易编写和理解..

在这种情况下,我会按照你的方式,但我会定义一些测试方法。以这种方式,代码将是可读的并且易于编写单元测试。 如果以后需要进行一些更改,您将理解代码。

示例:

testForLength();
testForLetters();
testForFirstTwoLetters();