Добрый день! Уже долго пытаюсь но что-то не оч выходит, подобрать регулярку для захвата части текста, находящегося между "Кодовыми выражениями": [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]
Собственно по примеру из файла, хочу выцепить куски текста, лежащие между кодами NETWORK, причем разбить сразу в отдельные элементы массива.
Может быть кто-нибудь тоже думал что-то в направлении такого парсера и подскажет что не так я делаю?
Добрый день! Уже долго пытаюсь но что-то не оч выходит, подобрать регулярку для захвата части текста, находящегося между "Кодовыми выражениями": [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]
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]
Здравствуйте. [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
krosav4ig, Благодарю! Функция очень даже =). Осталось уточнить пару неясным моментов: 1) Регулярные выражения поддерживают вложенные шаблоны "(?:(" & strt_ & ")(\s*))" , я правильно понимаю? Не очень ясно, как организуется подбор в этом случае. 2) что означают цифры в выражении (?=\2*\1|\z) и собственно, "z" тоже...?
krosav4ig, Благодарю! Функция очень даже =). Осталось уточнить пару неясным моментов: 1) Регулярные выражения поддерживают вложенные шаблоны "(?:(" & strt_ & ")(\s*))" , я правильно понимаю? Не очень ясно, как организуется подбор в этом случае. 2) что означают цифры в выражении (?=\2*\1|\z) и собственно, "z" тоже...?Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Пятница, 15.02.2019, 09:28
Roman777, 1. в коллекцию Submathes 2. \цифра - Ссылка на предыдущие зафиксированные (найденные) подстроки-соответствия шаблону (SubMatches) \z - конец текста Вот и вот почитайте, сохраните себе
Roman777, 1. в коллекцию Submathes 2. \цифра - Ссылка на предыдущие зафиксированные (найденные) подстроки-соответствия шаблону (SubMatches) \z - конец текста Вот и вот почитайте, сохраните себеsboy
sboy, Спасибо! Очень пригодится. Но на ресурсах относительно шаблона в шаблоне ничего не нашёл. Поидее шаблон ищет подстроки и выводит в "SubMatces". Но что из себя будет представлять "(?:(пример)(\s*))", не очень понимаю. Регулярка сначала должна найти по вложенному шаблону, подстроки? Чем будет "(?:(пример)(\s*))" отличаться от: "(?:пример\s*)" ?
sboy, Спасибо! Очень пригодится. Но на ресурсах относительно шаблона в шаблоне ничего не нашёл. Поидее шаблон ищет подстроки и выводит в "SubMatces". Но что из себя будет представлять "(?:(пример)(\s*))", не очень понимаю. Регулярка сначала должна найти по вложенному шаблону, подстроки? Чем будет "(?:(пример)(\s*))" отличаться от: "(?:пример\s*)" ?Roman777