Regex для номера телефона NANP с неповторяющимися последними 7 цифрами - PullRequest
0 голосов
/ 01 сентября 2011

Мне нужно проверить 10-значный (США) номер телефона в формате NANP (специальные символы не допускаются) в .NET, а также убедиться, что последние 7 цифр номера телефона не повторяются. До сих пор я написал следующее регулярное выражение для проверки формата NANP

^(?:[2-9][0-8][0-9])([2-9][0-9]{2}[0-9]{4})$

Как мне изменить это регулярное выражение, чтобы оно также учитывало неповторяющиеся последние 7 цифр? Обратите внимание, что использование двух регулярных выражений не допускается из-за ограничений существующего кода.

Edit: Я должен проверить наличие последовательных дубликатов во всех 7 цифрах. Например, 2062222222 следует считать недействительным, тогда как 2062221234 или 2062117777 следует считать действительным.

Спасибо

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Вы говорите о последовательных повторяющихся цифрах, или все семь цифр должны быть уникальными? Например:

2342497553  // consecutive duplicates
2345816245  // non-consecutive duplicates
2345816249  // no duplicates

Это регулярное выражение отфильтровывает последовательные дубликаты:

^(?:[2-9][0-8][0-9])(?!.*(\d)\1)([2-9][0-9]{2}[0-9]{4})$

... в то время как этот запрещает любые повторяющиеся цифры:

^(?:[2-9][0-8][0-9])(?!.*(\d).*\1)([2-9][0-9]{2}[0-9]{4})$

После того, как первые три цифры были использованы, опрашивающий пытается найти повторяющийся символ, либо сразу ((?!.*(.)\1)), либо с дополнительными промежуточными символами ((?!.*(.).*\1)). И это отрицательный прогноз, поэтому, если это удастся, общее совпадение не удастся.


РЕДАКТИРОВАТЬ: Оказывается, проблема проще, чем я думал. Чтобы отфильтровать числа типа 2345555555, где последние семь цифр идентичны, используйте это:

^(?:[2-9][0-8][0-9])(?!(\d)\1+$)([2-9][0-9]{2}[0-9]{4})$

Важно включить конечный якорь ($), потому что без этого он не сможет соответствовать действительным числам вроде 2345555556. В качестве альтернативы вы можете указать, что нужно искать ровно шесть захваченных цифр: (?!(\d)\1{6}).

0 голосов
/ 01 сентября 2011

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

...