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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2011, 19:15   #1
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию Использование регулярных выражений для извлечения части строки

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

Дано: Есть большое количество строк, содержащих описания серверов. В каждой такой строке встречается подстрока вида /XxYGbAB/, где:
X - количество модулей памяти, установленных в сервер;
Y - ёмкость одного модуля памяти;
AB - тип памяти. Может принимать значения "RD", "UD" или "R2D"
Данное заклинание отделено от остальных данных косыми чертами.

Например (часть строки опущена):
ProLiant DL320G6 E5520 (1URack X2,26GHzQuadCore/8Mb/2x2GbUD/P...
ProLiant DL320G6 L5609 (1URack X1,86GHzQuadCore/12Mb/2x2GbUD/...
ProLiant DL320G6 E5630 RPS (1URack X2,53GHzQCore/12Mb/3x2GbRD/...
ProLiant DL320G6 E5503 (1URack X2,0GHzDualCore/4Mb/2x2GbRD/4po...
ProLiant DL320G6 E5603 (1URack X1,66GHzQuadCore/4Mb/2x2GbRD/S...
Proliant ML330T06 E5606 LFF (Tower XeonQC 2.13GHz(8Mb)/2x2GbUD/...
Proliant DL360R07 E5620 (Rack1U XeonQC 2.4Ghz(12Mb)/3x4GbR2D/P4...

Прошу помочь в написании функции, которая принимала на вход строку, а возвращала бы три значения: количество модулей, их объём и тип.

Пробовал писать с помощью классического InStr, получается очень долго и как-то коряво.

Я даже написал регулярное выражение, которое ищет подстроку: "\d[x]\dGb[RU]2?[D]"

Последний раз редактировалось Meta2; 03.09.2011 в 19:31.
Meta2 вне форума Ответить с цитированием
Старый 03.09.2011, 19:39   #2
EugeneS
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 472
По умолчанию

добрый день, Meta2, см. вложение, код "test"
Вложения
Тип файла: zip Meta2.zip (8.6 Кб, 28 просмотров)

Последний раз редактировалось EugeneS; 03.09.2011 в 19:51.
EugeneS вне форума Ответить с цитированием
Старый 03.09.2011, 20:34   #3
vikttur
Участник клуба
 
Регистрация: 16.05.2010
Сообщений: 1,249
По умолчанию

Я без особых выражений (настроение хорошее ) написал формулы. Вдруг кому пригодятся.
Вложения
Тип файла: rar извлечь.rar (2.2 Кб, 29 просмотров)
vikttur вне форума Ответить с цитированием
Старый 03.09.2011, 20:47   #4
Meta2
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 38
По умолчанию

А я уже сам разобрался с регулярным выражением и написал готовый скрипт

Код:
Sub ParseServerNames()

Dim row_count As Integer: row_count = 2

Dim sh As Worksheet: Set sh = ActiveSheet

Dim sStr1 As String

Do While (sh.Cells(row_count, 1).Value <> "")
    
    sStr1 = sh.Cells(row_count, 2).Value
    
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBScript.RegExp")
    With objRegEx
        .Global = True
        .IgnoreCase = True
        .Pattern = "(\d)+[x]\dGb[RU](\d)?[D]"
        Set Matches = .Execute(sStr1)
    
        If Matches.Count <> 0 Then
    
            .Pattern = "(\d)+[x]"
            Set Qty = .Execute(Matches.Item(0).Value)
            sh.Cells(row_count, 6).Value = Left(Qty.Item(0).Value, Qty.Item(0).Length - 1)
            
            .Pattern = "[x]\d"
            Set Cap = .Execute(Matches.Item(0).Value)
            sh.Cells(row_count, 5).Value = Right(Cap.Item(0).Value, 1)
            
            .Pattern = "Gb[RU]"
            Set mType = .Execute(Matches.Item(0).Value)
            sh.Cells(row_count, 4).Value = Right(mType.Item(0).Value, 1)
        End If
    End With
    
    Set objRegEx = Nothing
    
    row_count = row_count + 1
Loop

End Sub

Последний раз редактировалось Meta2; 03.09.2011 в 20:53.
Meta2 вне форума Ответить с цитированием
Старый 04.09.2011, 18:18   #5
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Хорошо, но подстроки можно выделить за один раз - это то, что Вы берете в круглые скобки:
Код:
Sub ParseServerNames()
Dim c As Range
With CreateObject("VBScript.RegExp")
    .IgnoreCase = True
    .Pattern = "/(\d+)x(\d+)Gb([RU]2?)\D/"
    For Each c In ActiveSheet.UsedRange.Columns(2).Cells
        With .Execute(c)
            If .Count Then
                c(, 5) = .Item(0).submatches(0)
                c(, 4) = .Item(0).submatches(1)
                c(, 3) = .Item(0).submatches(2)
            End If
        End With
    Next
End With
End Sub
Вложения
Тип файла: rar извлечь1.rar (9.5 Кб, 26 просмотров)
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень удобная тестилка регулярных выражений (совершенно бесплатно))) alexplato Софт 4 02.01.2011 13:06
Вопрос по использованию регулярных выражений А здесь смотрели? alexplato Общие вопросы .NET 2 14.12.2010 20:33
Процедура для извлечения ресурса foxes Общие вопросы Delphi 3 02.05.2010 20:02