2015-09-01 7 views
0

Я пытаюсь сделать положительное/отрицательное (только) сопоставление кредитных карт. Мне нужно определить, есть ли дополнительные конечные числа (только).Совпадение кредитной карточки с регулярным выражением с использованием номера трейдера

Я могу иметь любую произвольную строку, но только вызывать совпадение, если есть более двух последовательных чисел (с любым пробелом) ПОСЛЕ количества.

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

\b(?<!\d.)(3[47]\d{2}([ -]?)(?!(\d)\3{5}|123456|234567|345678|5454545)\d{6}\2(?!(\d)\4{4})\d{5}|((4\d|5[1-5]|65)\d{2}|6011)([ -]?)(?!(\d)\8{3}|1234|3456|5678)\d{4}\7(?!(\d)\9{3})\d{4}\7\d{4})(\b|\s) 

Следующие матчи уже успешно совпадают:

some 4270446050075048 
4270-4460-5007-5048 
this:4270 4460 5007 5048. 
4270 4460 5007 5048 4/20 
4270 4460 5007 5048 what 
4270 4460 5007 5048 

Следующая успешно НЕ совпадают:

42704460500750a8 
4270 
4270 4460 5007 504 
42811293test123 

Однако это один становится все меня , Есть куча файлов с таким типом длинного числового шаблона, который продолжает попадать. Я хотел бы обновить включенную регулярное выражение, чтобы устранить действительное совпадение, если и только если за ней следует, по крайней мере, более 3-х чисел, например, в следующих примерах:

4270 4460 5007 5048 1234 5083 5095 5179 5157 5219 5187 5095 
4270 4460 5007 5048 123123115132124151231 
4270 4460 5007 5048123 
42704460500750481234 

Но следующий ДОЛЖНА ПРОДОЛЖИТЬ, чтобы создать матч (в связи с истечением даты нотация):

4270 4460 5007 5048 12 

Я попытался следующие, как отрицательного предпросмотра, но может быть недоразумение, что мне нужно сделать:

(?![\d][^\d][^\d]) 

Это RESU в некоторых странных изменениях в совпадениях, которые я не совсем понял (только согласованные строки без конечного пространства или с одним конечным пространством, но с любым количеством цифр). Я построил это в разделах, и я не уверен, как несколько функций lookaside взаимодействуют друг с другом, что может быть частью проблемы.

Если вы заинтересованы в попытке его, предварительно построенной обкатки для этого здесь:

https://regex101.com/r/oE1rZ1/2

Спасибо!

+0

Я не понимаю. Пожалуйста, будьте более конкретными. Какой шаблон вы используете. Что это такое (или не совпадение)? Что вы ожидаете от него? –

+0

Если вам нужно совпадение с отказом на основании чего-то после него, вам нужно использовать отрицательный результат. См. Http://www.regular-expressions.info/lookaround.html – Barmar

+0

Я обновил его, надеюсь, добавит ясности –

ответ

0

Поиграв с этим в течение 4 часов, понял, чего не хватает.

Строка мне было нужно:

(?!.\d\d) 

Окончательное согласование кредитной карты строка (лучший я когда-либо видел) это:

\b(?<!\d.)(3[47]\d{2}([ -]?)(?!(\d)\3{5}|123456|234567|345678|424242|545454|11111)\d{6}\2(?!(\d)\4{4})\d{5}|((4\d|5[1-5]|65)\d{2}|6011)([ -]?)(?!(\d)\8{3}|4242|5454|1234|3456|5678|2345|4567|1111)\d{4}\7(?!(\d)\9{3})\d{4}\7\d{4})(\b|\s)(?!.\d\d) 

Он грешит чуть-чуть на стороне ложных негативов, чтобы исключить большинство «пробных» и «образцовых» номеров, таких как 4242 4242 4242 42424 и 5454 5454 5454 5454 или 1234 5678 9012 3456 или 4111 1111 1111 1111, 4123 4567 8901 1111 и т. д.

Спасибо за вдохновение, ребята.:-)

Подробный набор тестов для данного регулярного выражения находится по этой ссылке:

https://regex101.com/r/rW1fF3/1