Поиск номеров регулярными выражениями
Никак не могу разобраться как работают регулярные выражения. В упор не понимаю пока, прочитал массу статей с примерами.
Есть многострочный текст в котором есть номера телефонов. Их надо найти и скопировать в массив. Я попробовал найти хотя бы начало +7 и 8 телефонов +79131231111 и 89131231111, например из текста "+79131231111\n89131231111\n89131231111". Но возвращает null. var str= '+79131231111\n89131231111\n89131231111'; var re= /(8\|+7)/g; alert('массив номеров: ' +re.exec(str)); |
И есть ли сервис где онлайн можно js проверять?
|
А если в тексте будет просто 88 или +7?
|
Я не знаю что будет. Я пока не понимаю как вообще доставать из строки данные при помощи регулярного выражения.
вот этот код я думал что выберет мне все цифры, а он две семерки через запятую выводит. странно в тексте только одна семерка var str= '+7\n88\n88'; var re= /(\d)/gi; alert('массив номеров: ' +re.exec(str)); |
Нигде в статьях не могу найти что означают круглые скобки, но их применяют. Какое-то запоминание.
Если без скобок, то одну семерку выводит. var str= '+7\n88\n88'; var re= /\d/gi; alert('массив номеров: ' +re.exec(str)); |
чем вас не устраивает скрипт, который есть здесь:
https://learn.javascript.ru/regexp-m...egexp-exec-str ? https://www.google.ru/webhp?q=regex+...q=regex+online |
Найти числа и + а за ним числа не проблематично, но тут вопрос о содержании текста, а что если в нем будет наряду с номерами и просто числа начинающиеся с 8: 812, 80, 81...? То есть надо определиться - что конкретно ищем, задать еще некое условие, например длину номера, и это при условии, что номера пишутся без форматирования, то есть пробелов, дефисов, скобок.
|
Цитата:
|
Цитата:
Т.е. необходимо из многострочного текста найти все номера 11-значные, начинающиеся с +7 или 8. и 7-значные. Найденные номера поместить в массив. |
А ну да + выводит остальные символы в строке, но по другим строкам не ищет. надо еще что-то добавить
var str= '+79131231111 lдоб. 105\n89131231111\n89131231111'; var re= /[0-9]+/gi; alert('массив номеров: ' +re.exec(str)); вот эта статья помогла понять этот момент http://dreamhelg.ru/2010/02/15-regul...eb-developers/ и так массив не получается сделать var str= '+79131231111 lдоб. 105 89131231122\n89131231133'; var re= /\d+/gm; rez= re.exec(str) alert('массив номеров: ' +rez[0]+' / '+rez[1]); |
Не так все просто как кажется. К примеру такая строка
var s = 'aaaa aa 89938493485 a aaaa 78328345343 aaa 6743423 aaa 7834 aaa 893 aaa 45673477333 aaaa 78328345343'; если надо найти мобильные начинающиеся с 7 и 8 длиной в 11 (плюс не учитываем, нужно, его так можно подставить ибо перед 8 его нет), то не сложно: alert(s.match(/[78]\d{10}/g)) Но если теперь добавить и поиск семизначных номеров, то уже не то получается: alert(s.match(/[78]\d{10}|\d{7}/g)) Гребет и лишнее. |
Потому что exec не так работает. Он выводит первым элементом массива найденное вхождение, вторым и последующими - содержимое скобок, после чего меняет индекс поиска. Если нужны скобки - следует использовать exec в цикле.
Подробнее. Если скобки не нужны, достаточно match: var str= '+79131231111 lдоб. 105 89131231122\n89131231133'; var re= /\d+/gm; rez= str.match(re) alert('массив номеров: ' +rez.join(' / ')); |
Цитата:
Вот думал что этот код выберет семизначные, ведь поставил \D (не цифра), как я понимаю, что после 7и цифр должна идти не цифра, а он почему-то выбирает первые 7 символов и у 11циферных номеров. var s = 'aaaa aa 89938493485 a aaaa 78328345343 aaa 2331444 aaa 7834 aaa 893 aaa 45673477333 3198804 aaaa 78328345343'; alert(s.match(/\d{7}\D/g)); |
Цитата:
var re= /(8|7|\+7)\d{10}/gm; rez= str.match(re) alert('массив номеров: ' +rez); Но вот можно ли в регулярном выражении заменить 7 на 8 и +7 на 8 ? |
Цитата:
Условий может быть много, поэтому либо рассматриваем все, либо, если точно знаем чего в строке может быть, а чего нет, упрощаем паттерн только до необходимого. Иначе проще получить все значения цифровые, а потом выбрать из них удовлетворяющие условию. |
Вот так получается найти семизначные номера, но он прикрепляет с обоих сторон не цифровые символы \D.
Т.е. можно найти 7-значный номер обрамленный с двух сторон не цифровыми символами и их не надо в результат поиска включать. Так же хорошо бы исключить при поиске семизначного номера ситуации +7913-9001245 (т.е. исключить из поиска когда слева от 7и знаков стоит дефис). var str= '+79131231111 lдоб. 105 89131231122\n3198804\n89131231133 2331444S'; var re= /\D\d{7}\D/gm; rez= str.match(re) alert('массив номеров: ' +rez); тут для первого номера "зацепляет" перенос строки, а второй семизначный номер "зацепляет" запятую и букву S. |
Цитата:
перед цифрами не дефис, перед цифрами не +, после цифр и перед цифрами не цифра, между цифрами может быть дефис скобка, первая из цифр не может быть 7 или 8 |
Если номера могут быть прописаны с форматированием, тогда никоим образом просто так - \d{7}, а также и мобильные номера не получить, паттерн будет сложнее. Если номера представлены как числи без разделителей, то проще потом разобраться в них, после их получения:
var s = 'aaaa aa 89938493485 a aaaa 78328345343 aaa 6743423 aaa 7834 aaa 893 aaa 45673477333 aaaa 78328345343'; var num = s.match(/\d+/g).filter(function(n) { if(n.length == 11 && /^7|8/.exec(n) || n.length == 7) return n }).join(','); alert(num) |
Часовой пояс GMT +3, время: 15:38. |