Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2015, 15:34   #1
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию Регулярные выражения. Для чайника

Хочу понять регулярные выражения. Почитал http://stackoverflow.com/questions/2...cell-and-loops
Темный лес
Для обучения я взял таблицу и хочу привести ее к виду, например для первого номер, +38 (067) 111 22 33
Код HTML:
(067)1112233
(044)*111-22-33
(0332)123456, 123457
(048)1234567, 123456
(0342)122156
+38 (0522) 12-43-56
0372-123456
(0512)654321
(066)1234567;(067)1234567
+38 (050) 111-22-33
773332211
(067)5556677 (067)9998877
Подскажите как решаются такие задания?

Для первой записи решил что pattern должен быть
"( [(] [0-9]{3} [)]) ([0-9]{3}) ([0-9]{2}) ([0-9]{2})"
Код:
Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "([(][0-9]{3}[)])([0-9]{3})([0-9]{2})([0-9]{2})"
    Dim RegEx      As VBScript_RegExp_55.RegExp
    Dim strInput As String
    Dim Myrange As Range
    Dim cell
    Set Myrange = ActiveSheet.Range("A2:A28")
    Set RegEx = New VBScript_RegExp_55.RegExp
    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = Replace(cell.Value, " ", "")
            With RegEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If RegEx.Test(strInput) Then
                cell.Offset(0, 1) = RegEx.Replace(strInput, "+38 $1 $2 $3 $4")
            End If
        End If
    Next
End Sub
Сработало, но почему также обработались строки
Код HTML:
(048)1234567, 123456 => +38 (048) 123 45 67,123456
(066)1234567;(067)1234567 => +38 (066) 123 45 67;+38 (067) 123 45 67
(067)5556677 (067)9998877 => +38 (067) 555 66 77+38 (067) 999 88 77
?

Вообщем, прошу подтолкнуть алгоритмом и в синтаксисе регулярных выражений.
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 25.12.2015, 17:16   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

с такими данными, где может быть несколько номеров в строке (через запятую, через точку с запятой, или вообще без разделителя), где второй и последующий номера могут быть в кратком формате (без кода города), - регуляркой одной лишь никак не справиться

сначала макрос, который приведет все данные в нормальный формат (все номера с одним количеством цифр, через единый разделитель),
а потом скобочки и пробелы и префикс добавить, - это легко (хоть регуляркой, хоть форматом числа, хоть простыми функциями VBA)

Но, начинать в любом случае надо с макроса, который уберет все лишние символы, допишет коды городов к тем номерам, где их нет, все разделители (запятые) между номерами проставит
EducatedFool вне форума Ответить с цитированием
Старый 25.12.2015, 19:14   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

написание масок - это практически язык программирования
синтаксис простой, но нужно практиковаться...
чем разношерстнее данные - тем сложнее придумать универсальную маску под них

Удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 25.12.2015, 21:45   #4
svsh2016
Форумчанин
 
Регистрация: 16.06.2015
Сообщений: 100
По умолчанию

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

Код:
Sub simpleRegex()
    Dim RegEx As Object
    Dim strInput As String
    Dim Myrange As Range
    Dim cell As Range
    Set Myrange = ActiveSheet.Range("A1:A28")
    Set RegEx = CreateObject("VBScript.RegExp"): RegEx.Global = True
    RegEx.Pattern = "([(][0-9]{3}[)])([0-9]{3})([0-9]{2})([0-9]{2})"
    For Each cell In Myrange
            strInput = Replace(cell.Value, " ", "")
            If RegEx.Test(strInput) Then
                cell.Offset(0, 1) = RegEx.Replace(strInput, "+38 $1 $2 $3 $4")
            End If
    Next
End Sub
затем вывод данных правее
Код:
Sub simpleRegex1()
    Dim RegEx As Object
    Dim strInput As String
    Dim Myrange As Range
    Dim cell As Range
    Set Myrange = ActiveSheet.Range("A1:A28")
    Set RegEx = CreateObject("VBScript.RegExp"): RegEx.Global = True
    RegEx.Pattern = "(\(\d{3}\))(\d{3})(\d{2})(\d{2})"
    For Each cell In Myrange
            strInput = Replace(cell.Value, " ", "")
            If RegEx.Test(strInput) Then
                cell.Offset(0, 3) = RegEx.Replace(strInput, "+38 $1 $2 $3 $4")
            End If
    Next
End Sub
Затем вывод данных еще правее

Код:
Sub simpleRegex2()
      Dim strInput$, Myrange As Range, cell As Range
    Set Myrange = ActiveSheet.Range("A1:A28")
    With CreateObject("VBScript.RegExp"): .Global = True: .Pattern = "(\(\d{3}\))(\d{3})(\d{2})(\d{2})"
       For Each cell In Myrange
            strInput = Replace(cell.Value, " ", "")
            If .Test(strInput) Then cell.Offset(0, 6) = .Replace(strInput, "+38 $1 $2 $3 $4")
       Next
    End With
End Sub
Отсюда видно недостаток исходного макроса,-надо привести данные к виду ячеек ,где макрос сработал.
Вложения
Тип файла: xls example_27_12_2015_progr.xls (41.0 Кб, 11 просмотров)
svsh2016 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярные выражения ACE Valery Общие вопросы .NET 12 14.04.2015 11:59
Регулярные выражения для парсинга alexzubarev99 Помощь студентам 0 06.05.2014 21:07
регулярные выражения Gen_r_questions PHP 15 25.04.2011 11:56
регулярные выражения для поиска и замены Елена Гох Microsoft Office Access 7 18.01.2011 19:39
регулярные выражения для постраничной навигации ilma55 PHP 4 16.03.2010 11:26