Страницы: 1
RSS
генератор регулярных выражений
 
делаю генератор PCRE на основе excel. Созданные регэкспы используются в поисковике для поиска телефонных номеров в базе данных.
На листе1 в ячейки B1:B200 вносятся телефонные номера, а при нажатии на кнопку, готовый "регэксп" копируется в буфер обмена. Вносимые номера содержат 7,10 или 11 цифр.
На листе1 в ячейках M2 и M3 для сравнения даны коды: желаемый и который сейчас получается
Нужно в каждом телефонном номере между цифрами разместить код «[^[:digit:]]*», а между телефонными номерами символ «|». Никаких других символов, включая пробелы, быть не должно
Можно ли вообще эту задачу формулами решить?
Изменено: Chinno - 12.02.2015 22:13:09
 
а что это за диалект такой?

по вопросу: макросом можно.
только строка длиненнькая получится. на 200-то номеров.
влезет в Ваш поисковик?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Perl-совместимые регулярные выражения.
Поисковик, как выяснилось, может обрабатывать код длинной 71000 символов (т.е. на 500 телефонных номеров, длинной 11 цифр каждый). Только при помощи формул мне не удалось такой код создать, поэтому 200 номеров.

Подскажите, как макросом эту задачу решить?
 
Цитата
Chinno пишет: как макросом эту задачу решить?
вот честное слово - на такой вопрос так и подмывает ответить:
1. написать соответствующий макрос
2. запустить его.

почему просто нельзя честно попросить: "напишите мне такой макрос"?
держите:
Код
Sub t()
  Dim lr&, a, i&, j&, s$
  With ActiveSheet
    lr = .Cells(.Rows.Count, 2).End(xlUp).Row
    a = .[b1].Resize(lr).Value
    For i = 1 To UBound(a)
      s = s & Left(a(i, 1), 1)
      For j = 2 To Len(a(i, 1)): s = s & "[^[:digit:]]*" & Mid(a(i, 1), j, 1): Next
      s = s & "|"
    Next
    s = Left(s, Len(s) - 1)
    .[m4].Value = s
  End With
End Sub
кстати,
Цитата
Chinno пишет: Поисковик, как выяснилось, может обрабатывать код длинной 71000 символов
учтите - в ячейку Excel столько буковок не влезет.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Покажу и я, коли сделал..
Скрытый текст
Изменено: Alexander88 - 12.02.2015 23:08:49
 
Огромно спасибо, работает как часы.  В ячейку влезает код на 230 11-значных номеров. У меня вопрос по этому макросу: если результат помещать не в ячейку M4, а копировать в буфер обмена, то возможно ли сгенерировать код большей длинны, номеров на 500?
Изменено: Chinno - 13.02.2015 11:29:18
 
с буфером точно не знаю - тестировать надо.
думаю, что можно.
если что - скиньте в текстовый файл.
он вообще практически безразмерный.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Chinno, посмотрите, во что превратился Ваш ответ, когда цитируете. ПРОСТО ответить никак было нельзя? Вернитесь в своё сообщение и исправьте.
 
Chinno, сообщение №6. Нельзя было написать: "ikki, спасибо, Ваш код..."? Без такого "распрекрасного" цитирования?
Прошу исправить.
 
Регэкспы на регэкспах делать нать.  :)
Код
Sub t()
    Dim str$, strc$, c As Range
    With CreateObject("vbscript.regexp")
        .ignorecase = False: .Global = True: .MultiLine = True: .Pattern = "(\d)"
        For Each c In [b1:b5]
            str = .Replace(c.Value, "[^[:digit:]]*$1")
            strc = strc & "|" & Mid$(str, 14)
        Next
    End With
    Range("M5") = Mid$(strc, 2)
End Sub
 
ну тогда уж без циклов и прочих лишних телодвижений   :)  
Код
Sub t()
  Set r = CreateObject("vbscript.regexp"): r.Global = True: r.Pattern = "(?=\d)(\d)(?=\d)"
  With ActiveSheet
    .[m6] = r.Replace(Join(Application.Transpose(.[b1].Resize(.Cells(.Rows.Count, 2).End(xlUp).Row).Value), "|"), "$1[^[:digit:]]*")
  End With
End Sub
Изменено: ikki - 13.02.2015 06:04:40
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Спасибо за несколько вариантов решения, хотя мне и первого хватило за глаза. Только подскажите пожалуйста ещё одну вещь, что нужно изменить в коде, чтобы результат копировался не в ячейку, а только в буфер обмена. Заранее спасибо.
 
Chinno, из правил форума (которые Вы, очевидно, не читали):
Цитата
Прежде чем задать вопрос - поищите на него ответ поиском по форуму и посмотрите статьи в Приемах. Здесь уже обсуждалось более 45 000 вопросов - вполне возможно (и даже скорее всего!), кто-то уже нашел решение.
Что и как именно Вы пытались искать?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Вариант с записью в буфер обмена
Страницы: 1
Наверх