Нужна помощь в обнаружении номеров с помощью Android Pattern - PullRequest
0 голосов
/ 09 января 2019

Мне нужно найти номерной знак в тексте, соответствующем приведенному ниже шаблону («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");
            }

Проблема в регулярном выражении, но я просто не понимаю, почему он работает, если это только номерной знак, но если у меня есть другой текст с номером, он не работает

1 Ответ

0 голосов
/ 09 января 2019

Символы регулярного выражения ^ и $ обозначают начало и конец ввода соответственно.

Замените их на \\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» и | означает «или»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...