2012-06-22 2 views
1

мне нужно проверить строку ввода, которая должна быть в следующей форме:проверки входной строки "RX-EZ12345678912345B" с использованием регулярных выражений

<2_upper_case_letters><"-"><2_upper_case_letters><14-digit number><1_uppercase_letter> 

Ex: RX-EZ12345678912345B

Я пытался что-то например, ^[IN]-?[A-Z]{0,2}?\\d{0,14}[A-Z]{0,1}, но это не дает ожидаемого результата.

Любая помощь будет оценена по достоинству.

Благодаря

ответ

1

Ваша самая большая проблема заключается в [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]$ 
+0

Спасибо Алан, [AZ] {2} в начале соответствует любым двум символам, есть ли способ ограничить первый символ «I», а второй «N» «? –

+0

См. Мое редактирование. Но если это должно начаться с 'IN', почему вы представили образец, который начинается с' RX'? –

1

Не уверен, что вы пытаетесь сделать в начале текущего регулярного выражения.

"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$" 

Регулярное выражение выше будет строго соответствовать входной строке, указанной вами. Если вы используете функцию matches, ^ и $ могут быть опущены.

Поскольку вы хотите точное количество повторений, вы должны указать его как {<number>}. {<number>,<number>} используется для переменного количества повторений. И ? указать, что токен до может или может появиться не - если он должен быть указан, то неверно указать ?.

0

Это должно решить вашу проблему. Проверьте действительность here

^[A-Z]{2}-[A-Z]{2}[0-9]{14}[A-Z]$ 
1

Просто переводить ваши требования в Java регулярное выражение:

"^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$" 

Это позволит вам использовать:

if (!input.matches("^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$")) { 
    // do something because input is invalid 
} 
+0

Привет nhahtdh, артистический, это регулярное выражение работало, за исключением того, что мне нужно restict первые два символа в «IN» , я изменил регулярное выражение на^[IN] {2} - [AZ] {2} \\ d {14} [AZ] $, но вернул true даже для 'NI'? –

0
^([A-Z]{2,2}[-]{1,1}[A-Z]{2,2}[0-9]{14,14}[A-Z]{1,1}){1,1}$ 
+1

Что это за '{1,1}', '{2,2}' материал? Если вы хотите потреблять ровно 2 или 14 единиц, '' {2} 'или' {14} '- это все, что вам нужно. (На самом деле, я не удивлюсь, если некоторые вкусы рассматривают длинную версию как синтаксическую ошибку.) Что касается '{1,1}', не утруждайте ее сокращением, просто избавитесь от нее. Все, что вы делаете, говорит движку регулярных выражений использовать один из предшествующих атомов, что и должно было произойти в любом случае. –

+0

указанный диапазон {min, max} Я получил это от egrep, где, например, {0,1} эквивалентны? Но я понял, что это уже давно устарело. THX для исправления меня –

1

^[A-Z]{2}-[A-Z]{2}\\d{14}[A-Z]$

Это должно решить вашу цель. Вы можете подтвердить это из here