2015-07-14 2 views
1

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

Все номера карт Visa начинаются с 4. Новые карты имеют 16 цифр. Старые карты имеют 13.

^4[0-9]{12}(?:[0-9]{3})?$ 

я понимаю эту часть:

^4[0-9]{12} 

и знак вопроса в конце (потому что последние 3 цифры не являются обязательными) , но я не понимаю, почему мы должны группа последняя часть, а также, если мы делаем это, почему нам нужно включать

?: 

я имею в виду, если есть больше 3 цифры мы должны захватить их, так почему мы используем группу без захвата?

ответ

2

Почему мы должны группировать последнюю часть?

Для того, чтобы мы могли сделать последние три дополнительными, последний последний символ станет необязательным. (\d\d)? не равно \d\d?.

(?:...) Группа неконвертируемых групп, обычно используемая для группировки символов или шаблонов, вы также можете использовать группу захвата (...), только если вы хотите записать последние три цифры в 16-значной карте №.

+0

У меня есть группировка, но я до сих пор не понимаю, почему нам нужно использовать группы, не захватывающие их, испытывая регулярное выражение на обеих кредитных картах 13-16 и оба «4 [0-9] {12} (? : [0-9] {3}) «? и '4 [0-9] {12} ([0-9] {3})?' работа – Micheal

+0

здесь группа, не связанная с захватом, увеличивает производительность по сравнению с группой захвата (которая хранит символы в временном буфере). –

3

Последняя часть, (?:[0-9]{3})?, сгруппирована с (?: ), так что окончательный ? применим ко всей группе. Если группировка не учитывается, регулярное выражение становится [0-9]{3}?, что на самом деле означает нечто совершенно другое. {x,y}? означает соответствие предыдущему выражению в любом месте от x до y раз, но предпочитает соответствовать как можно меньше раз (т. Е. Он не является жадным). {x}? не имеет смысла использовать, так как это означает, что он точно соответствует x раз, предпочитая как можно меньше - он идентичен {x}.

Причина, по которой используется не захватывающая группировка, (?: ), заключается в том, что нам не нужно фиксировать последние три цифры. Существует разница между совпадением шаблона, который вы делаете при проверке номера кредитной карты, и захватом части ее скобками. Соответствие просто говорит вам, соответствует ли входное выражение регулярному выражению, и это все, о чем мы заботимся здесь. Захват позволяет получить значение части входной строки. Вы могли бы использовать обычные скобки для скобок здесь, и это все равно будет соответствовать одному и тому же, но без необходимости было бы захватить последние три цифры, вероятно, будучи (немного) медленнее и используя (немного) больше памяти.

+0

Это ответ _perfect_! – sln