乌托邦识别号码 - REGEX模式匹配

时间:2015-03-13 06:36:25

标签: java regex validation

我正在尝试使用java regex类验证Utopian ID号,即Pattern和Matcher。

以下是需要满足的条件,

  1. 字符串必须以0-3(含)小写字母开头。
  2. 紧跟字母后,必须有一系列数字(0-9),此段的长度必须介于2和8之间(包括两者)。
  3. 紧跟数字后,必须至少有3个大写字母。
  4. 以下是我写的代码,

        public class Solution{public static void main(String[] args) {
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int ntc;
            String[] str;
            try {
                ntc = Integer.parseInt(br.readLine());
                str = new String[ntc];
                for (int i = 0; i < ntc; i++)
                    str[i] = br.readLine();
                for (int i = 0; i < ntc; i++)
                    if (validate(str[i]))
                        System.out.println("VALID");
                    else
                        System.out.println("INVALID");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static boolean validate(String str) {
            Pattern pr = Pattern.compile("[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}");
            Matcher mr = pr.matcher(str);
            return mr.find();
        }}
    

    以下是输入及其各自的o / p

    I / P: 3

    n761512618TUKEFQROSWNFWFWEQEXKPWYYCRK

    rRf99

    198VLHJIYVEBODQCQEGYGECOGRMQPE

    O / P:

    VALID

    INVALID

    VALID

    第一个测试用例是无效的,因为它有九个数字而不是最多八个。但它说有效。 在我写的正则表达式模式中有什么不对吗?

2 个答案:

答案 0 :(得分:0)

在正则表达式中按顺序使用开始和结束锚点来进行精确的字符串匹配。

Pattern pr = Pattern.compile("^[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}$");

没有锚点,它也会从字符串的中间匹配。

答案 1 :(得分:0)

使用Matcher.matches()而不是Matcher.find(),以便将正则表达式与整个字符串相匹配:

private static boolean validate(String str) {
    Pattern pr = Pattern.compile("[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}");
    Matcher mr = pr.matcher(str);
    return mr.matches();
}

此外,由于模式永远不会改变,我会将其移动到常量中,以便每次调用该方法时都不会重新编译:

static final Pattern UTOPIAN_ID_PATTERN =
        Pattern.compile("[a-z]{0,3}[0-9]{2,8}[A-Z]{3,}");

private static boolean validate(final String str) {
    Matcher mr = UTOPIAN_ID_PATTERN.matcher(str);
    return mr.matches();
}