我需要在文本中找到匹配如下所示模式的车牌号
(“ 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();
}


但是,如果我添加另一个带有车牌号的文本,例如下面的代码,则该文本始终为false

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(单词的开头/结尾),它应该可以工作。

Live demo

==编辑==

请注意,您的正则表达式本身可以简化,如果要收集所有匹配项,则应使用循环。看一看:

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”,而|表示“或”

09-27 13:34