2015-09-04 2 views
1

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

074xxxxxxx 
075xxxxxxx 
076xxxxxxx 
078xxxxxxx 
072xxxxxxx 
077xxxxxxx 
0251xxxxxx 
0351xxxxxx 

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

{ "Romania", new Regex("(/^(?:(?:(?:00\\s?|\\+)40\\s?|0)(?:7\\d{2}\\s?\\d{3}\\s?\\d{3}|(21|31)\\d{1}\\s?\\d{3}\\s?\\d{3}|((2|3)[3-7]\\d{1})\\s?\\d$)")} 

он не проверяет правильный формат номера.

Подробнее:

  • Если номер начинается с отличными от первоначальных, что я добавил, то это число не является действительным.

  • Х должен содержать любое количество, но не должна быть такой же number..like 0000000 1111111 т.д.

  • Он также может иметь следующий формат (но не обязательно): (072) XXXXXXX

Есть ли способ сделать это?

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

static IDictionary<string, Regex> countryRegex = new Dictionary<string, Regex>() 
{ 
    { "USA", new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")}, 
    { "UK", new Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")}, 
    { "Netherlands", new Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")}, 
}; 
+2

Вашего определение не достаточно ясно. Нужны ли жестко закодированные префиксы, которые вы указали, явно? Вы разрешаете определенные специальные символы? Вы пытаетесь вытащить только цифры, чтобы вы могли хранить только эти числа в базе данных? –

+0

Извините, я обновил описание. Было бы здорово, если бы я мог позволить ему «()» и «-» отделять числа – Valip

+1

Зачем использовать регулярное выражение? Вы можете просто проверить строки вручную и сэкономить всю эту боль. Regex не всегда является лучшим решением. –

ответ

2

Если я понимаю правила правильно, эта схема должна работать:

^(?<paren>\()?0(?:(?:72|74|75|76|77|78)(?(paren)\))(?<first>\d)(?!\k<first>{6})\d{6}|(?:251|351)(?(paren)\))(?<first>\d)(?!\k<first>{5})\d{5})$ 

Таким образом, вы можете добавить его в свой код так:

static IDictionary<string, Regex> countryRegex = new Dictionary<string, Regex>() 
{ 
    { "USA", new Regex("^[2-9]\\d{2}-\\d{3}-\\d{4}$")}, 
    { "UK", new Regex("(^1300\\d{6}$)|(^1800|1900|1902\\d{6}$)|(^0[2|3|7|8]{1}[0-9]{8}$)|(^13\\d{4}$)|(^04\\d{2,3}\\d{6}$)")}, 
    { "Netherlands", new Regex("(^\\+[0-9]{2}|^\\+[0-9]{2}\\(0\\)|^\\(\\+[0-9]{2}\\)\\(0\\)|^00[0-9]{2}|^0)([0-9]{9}$|[0-9\\-\\s]{10}$)")}, 
    { "Romania", new RegEx(@"^(?<paren>\()?0(?:(?:72|74|75|76|77|78)(?(paren)\))(?<first>\d)(?!\k<first>{6})\d{6}|(?:251|351)(?(paren)\))(?<first>\d)(?!\k<first>{5})\d{5})$")} 
}; 

Вот смысл картины:

  • ^ - матчи должны начинаться в начале входной строки
  • (?<paren>\()? - Опционально соответствует ( знак.Если она есть, она захватывает его в группу, названную paren
  • 0 - Номер должен начинаться с одного 0
  • (?: - Начинает нон-захватывая группу с целью согласования одного из двух различных форматов
  • (?:72|74|75|76|77|78)(?(paren)\))(?<first>\d)(?!\k<first>{6})\d{6} - Первый формат
    • (?:72|74|75|76|77|78) - следующие две цифры должны быть 72, 74, 75, 76, 77 или 78
    • (?(paren)\)) - Если отверстие ( существует, то должно быть закрытие ) здесь
    • (?<first>\d) - Матчи только первый из заканчивающихся семи цифр и фиксирует его в группе под названием first
    • (?!\k<first>{6}) - Отрицательный внешний вид -ahead, который гарантирует, что остальные шесть цифр не то же самое, что и первая
    • \d{6} - Матчи оставшимся шесть цифр
  • | - The или оператор
  • (?:251|351)(?(paren)\))(?<first>\d)(?!\k<first>{5})\d{5} - Второй формат
    • (?:251|351) - Следующие три цифры должны быть 251 или 351.
    • (?(paren)\)) - Если отверстие ( существует, то должно быть закрытие ) здесь
    • (?<first>\d) - Матчи только первый из шести цифр, заканчивающихся и фиксирует его в группе под названием first
    • (?!\k<first>{5}) - Отрицательное look- вперед, который гарантирует, что оставшиеся пять цифр не то же самое, что и первая
    • \d{5} - сопоставляет оставшиеся пять цифр
  • ) - Завершает без захвата группы, которая Уточнена два потенциальных форматов
  • $ - матч должен пройти весь путь до входной строки
+1

Это работает отлично! Спасибо за дополнительную информацию, теперь я могу обновить это выражение, если мне нужны другие условия – Valip

-1

Этот матч ваш пример:

0(([7][456728])|([23]51)).* 
+1

Это не проверяет правильность длины, и если «не должно быть такого же числа ... например 0000000 1111111 и т. Д.», – DBedrenko

+0

@NewWorld, когда я отправил ответ, он установил необходимость ...:/ –

0

Попробуйте это: ^(?=0[723][2-8]\d{7})(?!.*(.)\1{2,}).{10}$ - отрицательное опережение (?!...) тестируют повторяющиеся символы

я использую http://regexr.com/ для тестирования

Смежные вопросы