我正在尝试使用java regex类验证Utopian ID号,即Pattern和Matcher。
以下是需要满足的条件,
以下是我写的代码,
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
第一个测试用例是无效的,因为它有九个数字而不是最多八个。但它说有效。 在我写的正则表达式模式中有什么不对吗?
答案 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();
}