我需要在文本中找到一个车牌号码,与下面的模式相匹配("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");
}
问题在于正则表达式,但我只是不明白它为什么工作,如果它只是一个车牌号码,但如果我有其他文本与车牌号码,它不工作
发布于 2019-01-09 13:53:10
^
和$
正则表达式分别表示输入的开始和结束。
用\\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)
的意思是忽略-case,{3,4}
的意思是“从3到4”,|
的意思是“或”。
https://stackoverflow.com/questions/54111638
复制相似问题