Проверка для номера телефона для разрешения () и пробела, но регулярное выражение, которое я использую, не позволяет ввести их. - PullRequest
2 голосов
/ 08 ноября 2011
  string Phno=txt_EditPhno.Text;
        bool check = false;
        Regex regexObj = new Regex(@"^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$");
        if ((String.IsNullOrEmpty(Phno))||(regexObj.IsMatch(Phno)))
        {}

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

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

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

Используя это выражение соответствия:

(?i)^\D*1?\D*([2-9])\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)[^x]*?\s*(?:(?:e?(x)(?:\.|t\.?|tension)?)\D*(\d+))?.*$

и это выражение замены:

($1$2$3) $4$5$6-$7$8$9$10 $12$13

вам следуетбыть в состоянии переформатировать эти входные данные, как указано:

Input                         Output
----------------------------- --------------------------------
"1323-456-7890 540"           "(323) 456-7890 "
"8648217634"                  "(864) 821-7634 "
"453453453322"                "(453) 453-4533 "
"@404-327-4532"               "(404) 327-4532 "
"172830923423456"             "(728) 309-2342 "
"17283092342x3456"            "(728) 309-2342 x3456"
"jh345gjk26k65g3245"          "(345) 266-5324 "
"jh3g24235h2g3j5h3x245324"    "(324) 235-2353 x245324"
"12345678925x14"              "(234) 567-8925 x14"
"+1 (322)485-9321"            "(322) 485-9321 "
"804.555.1234"                "(804) 555-1234 "

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

Чтобы немного разбить выражение синтаксического анализа:

(?i)^\D*1?\D*                      # mode=ignore case; optional "1" in the beginning
([2-9])\D*(\d)\D*(\d)\D*           # three digits* with anything in between
(\d)\D*(\d)\D*(\d)\D*              # three more digits with anything in between
(\d)\D*(\d)\D*(\d)\D*(\d)[^x]*?    # four more digits with anything in between
\s*                                # optional whitespace
(?:(?:e?(x)(?:\.|t\.?|tension)?)   # extension indicator (see below)
\D*(\d+))?                         # optional anything before a series of digits
.*$                                # and anything else to the end of the string"

Три цифры не могут начинаться с 0 или 1.Индикатор расширения может быть x, ex, xt, ext (каждый из которых может иметь точку в конце), extension или xtension (который не может иметь точку вконец).

Как написано, расширение (то есть цифры) должно представлять собой непрерывный ряд чисел (но обычно это так, как предполагает ваше данное выражение)

Идеясостоит в том, чтобы использовать механизм регулярных выражений для извлечения первых 10 цифр (исключая «0» и «1», потому что внутренние телефонные номера в США не начинаются с них (кроме как с переключателем, который не нужен или всегда нужен, и не являетсязависит от телефона получателя, но телефон, в который вы его набираете.Затем он попытается вытащить что-нибудь до «x» и захватить «x» вместе с первой последовательной последовательностью цифр после этого.

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

1 голос
/ 08 ноября 2011

Указанная вами строка RegEx работает правильно:

System.Text.RegularExpressions.Regex regexObj = new System.Text.RegularExpressions.Regex(@"^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$");
regexObj.IsMatch("(555)-867-5309")
true
regexObj.IsMatch("+15558675309")
true
regexObj.IsMatch("+1.555.867.5309")
true
regexObj.IsMatch("+15558675309ext12345")
true
regexObj.IsMatch("+15558675309x12345")
true

Ошибка в вашем коде должна быть где-то еще. Вы всегда можете использовать такой инструмент, как RegExLib.com , чтобы проверить свой RegEx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...