Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 28.07.2015, 13:34
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Не так все просто как кажется. К примеру такая строка
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))

Гребет и лишнее.
Ответить с цитированием
  #12 (permalink)  
Старый 28.07.2015, 14:22
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

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

Если скобки не нужны, достаточно match:
var str= '+79131231111 lдоб. 105 89131231122\n89131231133';
var re= /\d+/gm;
rez= str.match(re)
alert('массив номеров: ' +rez.join(' / '));
__________________
29375, 35
Ответить с цитированием
  #13 (permalink)  
Старый 28.07.2015, 14:34
Аспирант
Отправить личное сообщение для SKLNSK Посмотреть профиль Найти все сообщения от SKLNSK
 
Регистрация: 27.02.2015
Сообщений: 66

Сообщение от laimas Посмотреть сообщение
Не так все просто как кажется. К примеру такая строка
Гребет и лишнее.
Спасибо, понятно как работает. 11-и значные номера нормально определяет, а вот 7и значные не понятно как выбрать. Так же бы и трехзначные бы выбрать.

Вот думал что этот код выберет семизначные, ведь поставил \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));
Ответить с цитированием
  #14 (permalink)  
Старый 28.07.2015, 14:44
Аспирант
Отправить личное сообщение для SKLNSK Посмотреть профиль Найти все сообщения от SKLNSK
 
Регистрация: 27.02.2015
Сообщений: 66

Сообщение от Aetae Посмотреть сообщение
Потому что exec не так работает. Он выводит первым элементом массива найденное вхождение, вторым и последующими - содержимое скобок, после чего меняет индекс поиска. Если нужны скобки - следует использовать exec в цикле.
Спасибо! Понятно! Да потом можно разбирать общий массив по длине номеров, отдельно сложить 7и значные трехзначные и т.д.

var re= /(8|7|\+7)\d{10}/gm;
rez= str.match(re)
alert('массив номеров: ' +rez);


Но вот можно ли в регулярном выражении заменить 7 на 8 и +7 на 8 ?
Ответить с цитированием
  #15 (permalink)  
Старый 28.07.2015, 14:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от SKLNSK
как я понимаю, что после 7и цифр должна идти не цифра
Ну это если, а \d{7}\D, это не понять что. Проблема в другом - выбрать число именно только семизначное, то есть ни до этих цифр, ни после них не должно быть цифр. Иначе в 45673477333 будет найдено 4567347.

Условий может быть много, поэтому либо рассматриваем все, либо, если точно знаем чего в строке может быть, а чего нет, упрощаем паттерн только до необходимого. Иначе проще получить все значения цифровые, а потом выбрать из них удовлетворяющие условию.
Ответить с цитированием
  #16 (permalink)  
Старый 28.07.2015, 14:55
Аспирант
Отправить личное сообщение для SKLNSK Посмотреть профиль Найти все сообщения от SKLNSK
 
Регистрация: 27.02.2015
Сообщений: 66

Вот так получается найти семизначные номера, но он прикрепляет с обоих сторон не цифровые символы \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.
Ответить с цитированием
  #17 (permalink)  
Старый 28.07.2015, 15:02
Аспирант
Отправить личное сообщение для SKLNSK Посмотреть профиль Найти все сообщения от SKLNSK
 
Регистрация: 27.02.2015
Сообщений: 66

Сообщение от laimas Посмотреть сообщение
Условий может быть много, поэтому либо рассматриваем все, либо, если точно знаем чего в строке может быть, а чего нет, упрощаем паттерн только до необходимого. Иначе проще получить все значения цифровые, а потом выбрать из них удовлетворяющие условию.
Я подумал, такой запрос должен быть для 7и-значного номера , вроде бы.
перед цифрами не дефис, перед цифрами не +, после цифр и перед цифрами не цифра, между цифрами может быть дефис скобка, первая из цифр не может быть 7 или 8
Ответить с цитированием
  #18 (permalink)  
Старый 28.07.2015, 15:13
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Если номера могут быть прописаны с форматированием, тогда никоим образом просто так - \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)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Борьба с регулярными выражениями raler jQuery 3 24.12.2013 16:47
Проблема с регулярными выражениями lexon Общие вопросы Javascript 2 27.06.2012 22:15
Функции для работы с регулярными выражениями Joshka Общие вопросы Javascript 5 21.06.2011 00:00
Замена с регулярными выражениями stqel Общие вопросы Javascript 4 23.08.2010 09:58
помогите с регулярными выражениями igsavenko Общие вопросы Javascript 2 21.08.2010 17:47