Почему это регулярное выражение не совпадает - PullRequest
0 голосов
/ 21 октября 2019

Я строю шаблон регулярного выражения для проверки введенной строки. Вот ограничения, которые я должен включить;

The letters a to z (upper and lowercase) (zero or many times)
o The numbers 0 to 9 (between zero and three times)
o The ampersand (&) character (zero or may times)
o The space character (zero or one time)

Вот регулярное выражение, которое я построил и протестировал на

[a-zA-Z&]*|[0-9]{0,3}|[\s]?

String p1 = "[a-zA-Z\\&]*|[0-9]{0,3}|[\\s]?" ;
        if (bankName.matches(p1) && bankName.length() >= 8) {
            System.out.println("Yes");
        }
        else{
            System.out.println("NO");
        }

Вот записи, которые я проверяю.

tXiPkaodan57yzrCxYjVT
String bankName = "tXiPkaodan57yzrCxYjVT" ;

На сайте, где я тестирую, регулярное выражение не совпадает, потому что числа (5 и 7) начались и находятся между буквами, но я включил в свой шаблон регулярных выражений, что можно включить любой диапазон чиселс 0-9 и 0-3 раза https://www.freeformatter.com/java-regex-tester.html#ad-output Сайт, на котором я тестировал

1 Ответ

0 голосов
/ 21 октября 2019

Столбцы ('или') в ваших регулярных выражениях имеют наибольший приоритет, поэтому регулярное выражение читает:

Соответствует, если входное значение точно одно из:

  1. Любой 0или более символов, которые ВСЕ соответствуют любой букве (любой регистр) или амперсанду,
  2. в любом месте от 0 до 3 цифр
  3. 0 или 1 пробел.

Ваш вводэто ничего из того;это смесь этих вещей. Например, ввод 'a1a' не соответствует вашему регулярному выражению, потому что, ну, пошагово проходите через него: 'a' заставляет совпадение регулярного выражения выбрать первый из ваших 3 вариантов выше, и это ... это. Там нет пути назад сейчас. Ваше регулярное выражение будет соответствовать a, не соответствует 1, и это конец.

Итак, как вы это исправите? Не придерживаясь регулярных выражений;это не хорошее решение для этой проблемы. Регулярное выражение, которое точно выполняет то, что вы просили, очень запутанно.

Вместо этого, почему бы просто не пройтись по каждому символу и иметь 4 счетчика (пробелы, цифры, буквы и другие вещи). Для каждого символа увеличивайте правый счетчик. Затем в конце убедитесь, что счетчик «прочее» равен 0, цифры - 3 или меньше, а пробелы - 1 или меньше, и тогда он действителен. В противном случае это не так.

...