java - 需要有关使用 Android Pattern 检测车牌号的帮助

标签 java regex

我需要在与下面这样的模式匹配的文本中找到车牌号 (“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 (单词的开头/结尾),它应该可以工作。

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

关于java - 需要有关使用 Android Pattern 检测车牌号的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54111638/

相关文章:

java - **/*.java 在 java 类路径中是什么意思

java - 在 Adob​​e AEM 上集成 Google Sheets API

java - 严重错误?在Android Studio中

java - 从 Google 存储桶删除用户(身份) IAM 策略不起作用

regex - 正则表达式只允许数字、逗号和破折号

Scala 中的正则表达式非捕获组

regex - VBA 正则表达式模式结合匹配和不匹配模式

ruby-on-rails - 使用正则表达式从字符串中提取电话号码?

sql teradata正则表达式包含模式匹配

java - Java 构造函数内部的多态性