Регулярное выражение Проверка номера телефона с пробелами и символами с минимальными цифрами - PullRequest
2 голосов
/ 20 июня 2019

У меня меньше навыков для Regex, и у меня есть быстрый вопрос. Мне нужно подтвердить ввод номера телефона с помощью regEx.

Пояснения / выражения будут действительно оценены. Номера телефонов могут быть любого из следующих форматов:

(94) 123 345
(94).456.7899
(94)-456-7899
94-456-7899
+94 456 7899
94 456 7899
0094 456 7899
(94) 123
122 3454
1223454

1) Число может содержать пробелы и символы или без символов.
2) В нем должно быть не менее 5 цифр без пробелов и символов. (я застрял в этой точке)

1-я попытка

export const basicPhoneNumber = value =>
value && !/^\+?\d+$/i.test(value) 
? 'Invalid phone number' 
: undefined;

2-я попытка

  export const basicPhoneNumber = value =>
  value && !/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4,})/i.test(value) 
  ? 'Invalid phone number' 
  : undefined;

Большое спасибо за вашу помощь и хорошую!

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Если все, что вам нужно сделать, это проверить телефонные номера по указанным критериям, вы можете сначала удалить все нецифровые символы, а затем проверить с помощью RegExp.

Мало того, что это намного проще, это также намного легче понять.

// Sample data
const numbers = [
  '(94) 123 345',
  '(94).456.7899',
  '(94)-456-7899',
  '94-456-7899',
  '+94 456 7899',
  '94 456 7899',
  '0094 456 7899',
  '(94) 123',
  '122 3454'
]

// The validation function
const validate = value => {
  value = value.replace(/\D|(^0+)/g, '');
  return /^\d{5,}$/.test(value);
}

// Tests
numbers.forEach(function(phone){
  console.log(validate(phone), `"${phone}"`);
});

Объяснение RegExp:

/\D|(^0+)/g

  1. \D соответствует всем не цифрам
  2. (^0+) совпадает, если есть хотя бы один ведущий 0 символ.

/^\d{5,}$/

Совпадениякогда строка начинается и заканчивается цифрой, и когда строка состоит не менее чем из 5 цифр, без каких-либо цифр.

2 голосов
/ 20 июня 2019

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

^\+?\(?([0-9]{2,4})[)\s.-]+([0-9]{3,4})([\s.-]+([0-9]{3,4}))?$

, что может привести к сбою в некоторых желаемых случаях, которые не перечислены, несмотря на то, что некоторые входные данные, такие как (000) 000-0000, на самом деле не являются телефонными номерами.

const regex = /^\+?\(?([0-9]{2,4})[)\s.-]+([0-9]{3,4})([\s.-]+([0-9]{3,4}))?$/gmi;
const str = `(94) 123 345
(94).456.7899
(94)-456-7899
94-456-7899
+94 456 7899
94 456 7899
0094 456 7899
(94) 123
122 3454`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Демо 1

Редактировать

Для разрешения 12234554 мы бы сделали необязательную группу для ([)\s.-]+)?,

^\+?\(?([0-9]{2,4})([)\s.-]+)?([0-9]{3,4})([\s.-]+([0-9]{3,4}))?$

Демо 2

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