我需要在与下面这样的模式匹配的文本中找到车牌号 (“L”代表字母,“D”代表数字):
LLLDDD,LLLDDDD,LLDDDD,DDDDLL
它们之间可以有空格,例如 LLL DDD
如果文本只是车牌号(例如“SS1234”),我的方法可以正常工作
public static boolean plateNumberExist(String target) {
return Pattern.compile("^([A-Za-z]{3} ?[0-9]{3})?([A-Za-z]{3} ?[0-9]{4})?([A-Za-z]{2} ?[0-9]{4})?([0-9]{4} ?[A-Za-z]{2})?$").matcher(target).matches();
}
但是如果我添加另一个带有车牌号的文本(如下面的代码),那么它总是错误的
if(plateNumberExist("Republic SS1234")){
showToast("Plate Number Found");
}else{
showToast("No Plate Number");
}
所以我用来获取车牌号的实际代码是下面的代码,但它也不起作用。
String inputString = "Republic SS1234";
Pattern pattern = Pattern.compile("^([A-Za-z]{3} ?[0-9]{3})?([A-Za-z]{3} ?[0-9]{4})?([A-Za-z]{2} ?[0-9]{4})?([0-9]{4} ?[A-Za-z]{2})?$");
Matcher matcher = pattern.matcher(inputString);
if (matcher.find()) {
String platenumber = inputString.substring(matcher.start(), matcher.end());
showToast(platenumber);
} else {
showToast("No Plate Number Found");
}
问题出在正则表达式上,但我只是不明白为什么它可以工作,如果它只是一个车牌号,但如果我有其他带有车牌号的文本,它就不起作用
最佳答案
^
和 $
正则表达式符号分别表示输入的开始和结束。
将其替换为 \\b
(单词的开头/结尾),它应该可以工作。
==编辑==
请注意,您的正则表达式本身可以简化,如果您想收集所有匹配项,您应该使用循环。看看:
String inputString = "Republic SS1234 and ABC 1234";
Pattern pattern = Pattern.compile(
"(?i)\\b([A-Z]{3} ?[0-9]{3,4}|[A-Z]{2} ?[0-9]{4}|[0-9]{4} ?[A-Z]{2})\\b");
Matcher matcher = pattern.matcher(inputString);
while (matcher.find()) {
String platenumber = matcher.group(1);
. . .
}
(?i)
表示忽略大小写,{3,4}
表示“从 3 到 4”,|
表示“或”
关于java - 需要有关使用 Android Pattern 检测车牌号的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54111638/