Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Регулярные выражения Выцепить текст между "Кодом" - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Регулярные выражения Выцепить текст между "Кодом"
Roman777 Дата: Четверг, 14.02.2019, 18:14 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Добрый день!
Уже долго пытаюсь но что-то не оч выходит, подобрать регулярку для захвата части текста, находящегося между "Кодовыми выражениями":
[vba]
Код
'Функция переписана, чтобы чётко определять разделения с начала новой строки строки
Function GetBetweenREXP(s As String, strt_ As String, end_ As String) As Variant
'Если end_ ="", считаем от strt_ до следующего strt
    Dim subStr() As String
    Dim oReg As Object
    Dim colMatches As Object
    Dim lenMatch As Long
    Dim sLen&, eLen&
    Set oReg = CreateObject("VBScript.RegExp")
    oReg.Global = True
    oReg.Pattern = "\r\n" & strt_ & "([\s|\S]+?\r\n" & end_ & ")"
    If end_ = "" Then
        oReg.Pattern = "\r\n" & strt_ & "[\s\S]+(?!\r\n" & strt_ & ")"
    End If
    Set colMatches = oReg.Execute(s)
    If colMatches.Count = 0 Then Exit Function
    ReDim subStr(1 To colMatches.Count) 'без первого и последнего
    sLen = Len(strt_)
    eLen = Len(end_)
    For i = 0 To colMatches.Count - 1
        
        lenMatch = Len(colMatches.Item(i).Value)
        
        subStr(i + 1) = Mid(Trim(colMatches.Item(i).Value), sLen + 2, lenMatch - sLen - 2 - eLen + 2 * (eLen > 0))
    Next i
    GetBetween = subStr
End Function
[/vba]
Есть два варианта её использования, когда есть два "кодовых слова": start и end и когда только start, end в этом случае = "".
Для первого случая, вроде как отрабатывается:
[vba]
Код
oReg.Pattern = "\r\n" & strt_ & "([\s|\S]+?\r\n" & end_ & ")"
[/vba]

Но вот проблема со вторым случаем, когда между интересующими фрагментами текста только одно разделительное выражение:
[vba]
Код
oReg.Pattern = "\r\n" & strt_ & "[\s\S]+(?!\r\n" & strt_ & ")"
[/vba]

Собственно по примеру из файла, хочу выцепить куски текста, лежащие между кодами NETWORK, причем разбить сразу в отдельные элементы массива.

Может быть кто-нибудь тоже думал что-то в направлении такого парсера и подскажет что не так я делаю?
К сообщению приложен файл: 5515722.xlsx (9.8 Kb)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Четверг, 14.02.2019, 18:18
 
Ответить
СообщениеДобрый день!
Уже долго пытаюсь но что-то не оч выходит, подобрать регулярку для захвата части текста, находящегося между "Кодовыми выражениями":
[vba]
Код
'Функция переписана, чтобы чётко определять разделения с начала новой строки строки
Function GetBetweenREXP(s As String, strt_ As String, end_ As String) As Variant
'Если end_ ="", считаем от strt_ до следующего strt
    Dim subStr() As String
    Dim oReg As Object
    Dim colMatches As Object
    Dim lenMatch As Long
    Dim sLen&, eLen&
    Set oReg = CreateObject("VBScript.RegExp")
    oReg.Global = True
    oReg.Pattern = "\r\n" & strt_ & "([\s|\S]+?\r\n" & end_ & ")"
    If end_ = "" Then
        oReg.Pattern = "\r\n" & strt_ & "[\s\S]+(?!\r\n" & strt_ & ")"
    End If
    Set colMatches = oReg.Execute(s)
    If colMatches.Count = 0 Then Exit Function
    ReDim subStr(1 To colMatches.Count) 'без первого и последнего
    sLen = Len(strt_)
    eLen = Len(end_)
    For i = 0 To colMatches.Count - 1
        
        lenMatch = Len(colMatches.Item(i).Value)
        
        subStr(i + 1) = Mid(Trim(colMatches.Item(i).Value), sLen + 2, lenMatch - sLen - 2 - eLen + 2 * (eLen > 0))
    Next i
    GetBetween = subStr
End Function
[/vba]
Есть два варианта её использования, когда есть два "кодовых слова": start и end и когда только start, end в этом случае = "".
Для первого случая, вроде как отрабатывается:
[vba]
Код
oReg.Pattern = "\r\n" & strt_ & "([\s|\S]+?\r\n" & end_ & ")"
[/vba]

Но вот проблема со вторым случаем, когда между интересующими фрагментами текста только одно разделительное выражение:
[vba]
Код
oReg.Pattern = "\r\n" & strt_ & "[\s\S]+(?!\r\n" & strt_ & ")"
[/vba]

Собственно по примеру из файла, хочу выцепить куски текста, лежащие между кодами NETWORK, причем разбить сразу в отдельные элементы массива.

Может быть кто-нибудь тоже думал что-то в направлении такого парсера и подскажет что не так я делаю?

Автор - Roman777
Дата добавления - 14.02.2019 в 18:14
krosav4ig Дата: Пятница, 15.02.2019, 02:00 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Здравствуйте.
[vba]
Код
Function GetBetweenREXP(s$, strt_$, Optional end_$ = "") As Variant
    Dim subStr$(), i&
    end_ = IIf(end_ = "", "\1", end_)
    With CreateObject("vbscript.regexp")
        .Global = 1: .MultiLine = 1: .ignorecase = 1
        .Pattern = "(?:(" & strt_ & ")(\s*))([\S\s]*?)(?=\2*" & end_ & "|\z)"
        If Not .test(s) Then Exit Function
        For Each m In .Execute(s)
            ReDim Preserve subStr(i)
            subStr(i) = m.submatches(2)
            i = i + 1
        Next
    End With
    GetBetweenREXP = subStr
End Function
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Пятница, 15.02.2019, 02:01
 
Ответить
СообщениеЗдравствуйте.
[vba]
Код
Function GetBetweenREXP(s$, strt_$, Optional end_$ = "") As Variant
    Dim subStr$(), i&
    end_ = IIf(end_ = "", "\1", end_)
    With CreateObject("vbscript.regexp")
        .Global = 1: .MultiLine = 1: .ignorecase = 1
        .Pattern = "(?:(" & strt_ & ")(\s*))([\S\s]*?)(?=\2*" & end_ & "|\z)"
        If Not .test(s) Then Exit Function
        For Each m In .Execute(s)
            ReDim Preserve subStr(i)
            subStr(i) = m.submatches(2)
            i = i + 1
        Next
    End With
    GetBetweenREXP = subStr
End Function
[/vba]

Автор - krosav4ig
Дата добавления - 15.02.2019 в 02:00
Roman777 Дата: Пятница, 15.02.2019, 09:27 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
krosav4ig, Благодарю! Функция очень даже =). Осталось уточнить пару неясным моментов:
1) Регулярные выражения поддерживают вложенные шаблоны "(?:(" & strt_ & ")(\s*))" , я правильно понимаю? Не очень ясно, как организуется подбор в этом случае.
2) что означают цифры в выражении (?=\2*\1|\z) и собственно, "z" тоже...?


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Пятница, 15.02.2019, 09:28
 
Ответить
Сообщениеkrosav4ig, Благодарю! Функция очень даже =). Осталось уточнить пару неясным моментов:
1) Регулярные выражения поддерживают вложенные шаблоны "(?:(" & strt_ & ")(\s*))" , я правильно понимаю? Не очень ясно, как организуется подбор в этом случае.
2) что означают цифры в выражении (?=\2*\1|\z) и собственно, "z" тоже...?

Автор - Roman777
Дата добавления - 15.02.2019 в 09:27
sboy Дата: Пятница, 15.02.2019, 11:42 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Roman777, 1. в коллекцию Submathes
2. \цифра - Ссылка на предыдущие зафиксированные (найденные) подстроки-соответствия шаблону (SubMatches)
\z - конец текста
Вот и вот почитайте, сохраните себе


Яндекс: 410016850021169
 
Ответить
СообщениеRoman777, 1. в коллекцию Submathes
2. \цифра - Ссылка на предыдущие зафиксированные (найденные) подстроки-соответствия шаблону (SubMatches)
\z - конец текста
Вот и вот почитайте, сохраните себе

Автор - sboy
Дата добавления - 15.02.2019 в 11:42
Roman777 Дата: Пятница, 15.02.2019, 21:52 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
sboy, Спасибо! Очень пригодится. Но на ресурсах относительно шаблона в шаблоне ничего не нашёл.
Поидее шаблон ищет подстроки и выводит в "SubMatces". Но что из себя будет представлять "(?:(пример)(\s*))", не очень понимаю. Регулярка сначала должна найти по вложенному шаблону, подстроки? Чем будет
"(?:(пример)(\s*))" отличаться от:
"(?:пример\s*)" ?


Много чего не знаю!!!!
 
Ответить
Сообщениеsboy, Спасибо! Очень пригодится. Но на ресурсах относительно шаблона в шаблоне ничего не нашёл.
Поидее шаблон ищет подстроки и выводит в "SubMatces". Но что из себя будет представлять "(?:(пример)(\s*))", не очень понимаю. Регулярка сначала должна найти по вложенному шаблону, подстроки? Чем будет
"(?:(пример)(\s*))" отличаться от:
"(?:пример\s*)" ?

Автор - Roman777
Дата добавления - 15.02.2019 в 21:52
krosav4ig Дата: Пятница, 15.02.2019, 23:38 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Чем будет
"(?:(пример)(\s*))" отличаться от:
"(?:пример\s*)" ?

тем, что придется вместо
[vba]
Код
(?:(пример)(\s*))([\S\s]*?)(?=\2*\1|\z)
[/vba]
писать так
[vba]
Код
(?:пример\s*)([\S\s]*?)(?=\s*пример|\z)
[/vba]

в regex захватываемые группы нумеруются слева направо, по уровням вложенности
[vba]
Код
(?:(1группа(2группа))(3группа))(4группа(?:)(5группа))
[/vba]
и, соответсвенно, [vba]
Код
SubMatches(0)=1группа2группа
SubMatches(1)=2группа
SubMatches(2)=3группа
[/vba]
и т.д.


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщение
Чем будет
"(?:(пример)(\s*))" отличаться от:
"(?:пример\s*)" ?

тем, что придется вместо
[vba]
Код
(?:(пример)(\s*))([\S\s]*?)(?=\2*\1|\z)
[/vba]
писать так
[vba]
Код
(?:пример\s*)([\S\s]*?)(?=\s*пример|\z)
[/vba]

в regex захватываемые группы нумеруются слева направо, по уровням вложенности
[vba]
Код
(?:(1группа(2группа))(3группа))(4группа(?:)(5группа))
[/vba]
и, соответсвенно, [vba]
Код
SubMatches(0)=1группа2группа
SubMatches(1)=2группа
SubMatches(2)=3группа
[/vba]
и т.д.

Автор - krosav4ig
Дата добавления - 15.02.2019 в 23:38
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!