Ваша самая большая проблема заключается в [IN]
в начале, что соответствует только одно письмо, и только если это I
или N
. Если вы хотите совместить два из любых писем, используйте [A-Z]{2}
.
Как только вы исправите это, ваше регулярное выражение будет по-прежнему соответствовать только RX-E
. Это потому, что [A-Z]{0,2}?
начинает пытаться ничего не поглощать, благодаря неохотному квантору, {0,2}?
. Затем \d{0,14}
соответствует нулевым цифрам, а [A-Z]{0,1}
жадно поглощает E
.
Если вы хотите совместить ровно 2 буквы и 14 цифр, используйте [A-Z]{2}
и \d{14}
. И поскольку вы проверяете строку, вы должны закончить регулярное выражение конечным якорем, $
.Результат:
^[A-Z]{2}-[A-Z]{2}\d{14}[A-Z]$
... или, как строка Java буквальная:
"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$"
Как @nhahtdh наблюдаемое, вы действительно не должны использовать якоря, если вы используете метод в Java matches()
для применения регулярного выражения, но я рекомендую это делать в любом случае. Он лучше передает ваши намерения, и это делает перенос regex, если вы должны использовать его в другом вкусе/контексте.
EDIT: Если первые два символа должны быть точно IN
, было бы
^IN-[A-Z]{2}\d{14}[A-Z]$
Спасибо Алан, [AZ] {2} в начале соответствует любым двум символам, есть ли способ ограничить первый символ «I», а второй «N» «? –
См. Мое редактирование. Но если это должно начаться с 'IN', почему вы представили образец, который начинается с' RX'? –