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

Вход

Регистрация

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

 

= Мир MS Excel/Вытащить подстроку, расположенную между 2 шаблонами регэксп - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вытащить подстроку, расположенную между 2 шаблонами регэксп (Макросы/Sub)
Вытащить подстроку, расположенную между 2 шаблонами регэксп
Udik Дата: Суббота, 30.01.2016, 15:05 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Имеется строка, внутри неё 2 условных маркера. Нужно вытащить то, что между ними. Сейчас я тупо заменяю на "" сначала первый шаблон, потом второй. Остаток, то что надо. Собственно вопрос: можно ли это одной операцией проделать с помощью регулярных выражений? И если да, то как?
В других программах регэкспы позволяют группы вытягивать, т.е. 1-я группа соответствует 1-ой части шаблона, 2-я второй и т.д. А тут чего-то не пойму возможно ли так.
вот код тестовой функции
[vba]
Код

Public Sub test()
Dim str1 As String, pttr1$, pttrn2$
Dim objRegExp As Object

pttr1 = ".*m1 "
pttr2 = " m2.*"
str1 = "мусор m1 то что надо m2 мусор"

Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = pttr1
str1 = objRegExp.Replace(str1, "")
objRegExp.Pattern = pttr2
str1 = objRegExp.Replace(str1, "")
Debug.Print str1
End Sub

[/vba]
К сообщению приложен файл: 0t.xlsb (16.1 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
СообщениеИмеется строка, внутри неё 2 условных маркера. Нужно вытащить то, что между ними. Сейчас я тупо заменяю на "" сначала первый шаблон, потом второй. Остаток, то что надо. Собственно вопрос: можно ли это одной операцией проделать с помощью регулярных выражений? И если да, то как?
В других программах регэкспы позволяют группы вытягивать, т.е. 1-я группа соответствует 1-ой части шаблона, 2-я второй и т.д. А тут чего-то не пойму возможно ли так.
вот код тестовой функции
[vba]
Код

Public Sub test()
Dim str1 As String, pttr1$, pttrn2$
Dim objRegExp As Object

pttr1 = ".*m1 "
pttr2 = " m2.*"
str1 = "мусор m1 то что надо m2 мусор"

Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = pttr1
str1 = objRegExp.Replace(str1, "")
objRegExp.Pattern = pttr2
str1 = objRegExp.Replace(str1, "")
Debug.Print str1
End Sub

[/vba]

Автор - Udik
Дата добавления - 30.01.2016 в 15:05
SLAVICK Дата: Суббота, 30.01.2016, 16:31 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
заменяю на "" сначала первый шаблон, потом второй

Так можно же сразу, просто поставив условие "(?:.+m1 | \m2.+)" :) , и выбрав .Global = 1
[vba]
Код
Public Sub test()
Dim str1 As String, pttr1$, pttrn2$
Dim objRegExp As Object
pttr1 = "(?:.+m1 | \m2.+)"
str1 = "мусор m1 то что надо m2 мусор"
Set objRegExp = CreateObject("VBScript.RegExp")
With objRegExp
.Pattern = pttr1
.Global = 1
End With
str1 = objRegExp.Replace(str1, "")
Debug.Print str1
End Sub
[/vba]
ЗЫ вот хороший сайт для проверки регулярок
А тут можно про них почитать


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
заменяю на "" сначала первый шаблон, потом второй

Так можно же сразу, просто поставив условие "(?:.+m1 | \m2.+)" :) , и выбрав .Global = 1
[vba]
Код
Public Sub test()
Dim str1 As String, pttr1$, pttrn2$
Dim objRegExp As Object
pttr1 = "(?:.+m1 | \m2.+)"
str1 = "мусор m1 то что надо m2 мусор"
Set objRegExp = CreateObject("VBScript.RegExp")
With objRegExp
.Pattern = pttr1
.Global = 1
End With
str1 = objRegExp.Replace(str1, "")
Debug.Print str1
End Sub
[/vba]
ЗЫ вот хороший сайт для проверки регулярок
А тут можно про них почитать

Автор - SLAVICK
Дата добавления - 30.01.2016 в 16:31
Udik Дата: Суббота, 30.01.2016, 20:13 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Ага, получаем что требовалось, осталось освежить знания по регэкспам :)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
СообщениеАга, получаем что требовалось, осталось освежить знания по регэкспам :)

Автор - Udik
Дата добавления - 30.01.2016 в 20:13
buchlotnik Дата: Суббота, 30.01.2016, 20:24 | Сообщение № 4
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
SLAVICK, а зачем обратный слэш? Без него тоже пашет (или я что упустил)


Сообщение отредактировал buchlotnik - Суббота, 30.01.2016, 20:24
 
Ответить
СообщениеSLAVICK, а зачем обратный слэш? Без него тоже пашет (или я что упустил)

Автор - buchlotnik
Дата добавления - 30.01.2016 в 20:24
SLAVICK Дата: Суббота, 30.01.2016, 20:51 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Без него тоже пашет (или я что упустил)

Не все правильно, это я сначала ставил m\d (цифры), а потом решил написать как сейчас. А слеш забыл убрать :o .


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Без него тоже пашет (или я что упустил)

Не все правильно, это я сначала ставил m\d (цифры), а потом решил написать как сейчас. А слеш забыл убрать :o .

Автор - SLAVICK
Дата добавления - 30.01.2016 в 20:51
Udik Дата: Суббота, 30.01.2016, 21:29 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64
Нашел то что мне надо, но у меня сегодня мозг тупит. Как получить значение Item 2 в переменную?

[vba]
Код

Public Sub test()
Dim str1 As String, pttr1$, pttrn2$
Dim objRegExp As Object

str1 = "мусор m1 то что надо m2 мусор"
Set objRegExp = CreateObject("VBScript.RegExp")
pttr1 = "(.+m1 )(.+[^m2])( m2.+)"

objRegExp.Pattern = pttr1
objRegExp.Global = True
Set t = objRegExp.Execute(str1)

'Debug.Print t.Item(1).Submatches.Item(1)
End Sub
[/vba]
К сообщению приложен файл: 3204654.xlsb (16.5 Kb) · 6744076.jpg (21.2 Kb)


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com


Сообщение отредактировал Udik - Суббота, 30.01.2016, 21:35
 
Ответить
СообщениеНашел то что мне надо, но у меня сегодня мозг тупит. Как получить значение Item 2 в переменную?

[vba]
Код

Public Sub test()
Dim str1 As String, pttr1$, pttrn2$
Dim objRegExp As Object

str1 = "мусор m1 то что надо m2 мусор"
Set objRegExp = CreateObject("VBScript.RegExp")
pttr1 = "(.+m1 )(.+[^m2])( m2.+)"

objRegExp.Pattern = pttr1
objRegExp.Global = True
Set t = objRegExp.Execute(str1)

'Debug.Print t.Item(1).Submatches.Item(1)
End Sub
[/vba]

Автор - Udik
Дата добавления - 30.01.2016 в 21:29
doober Дата: Суббота, 30.01.2016, 21:52 | Сообщение № 7
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Оно?
[vba]
Код
Debug.Print t.Item(0).Submatches.Item(1)
[/vba]


 
Ответить
СообщениеОно?
[vba]
Код
Debug.Print t.Item(0).Submatches.Item(1)
[/vba]

Автор - doober
Дата добавления - 30.01.2016 в 21:52
Gustav Дата: Воскресенье, 31.01.2016, 01:24 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2742
Репутация: 1137 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
А если банальный дабл-сплит? Или это слишком банально?
[vba]
Код
Sub test3()
    Dim str1 As String
    str1 = "мусор m1 то что надо m2 мусор"
    str1 = Split(Split(str1, "m1 ")(1), " m2")(0)
    Debug.Print str1 'то что надо
End Sub
[/vba]


МОИ: Ник, Tip box: 41001663842605
 
Ответить
СообщениеА если банальный дабл-сплит? Или это слишком банально?
[vba]
Код
Sub test3()
    Dim str1 As String
    str1 = "мусор m1 то что надо m2 мусор"
    str1 = Split(Split(str1, "m1 ")(1), " m2")(0)
    Debug.Print str1 'то что надо
End Sub
[/vba]

Автор - Gustav
Дата добавления - 31.01.2016 в 01:24
sv2014 Дата: Воскресенье, 31.01.2016, 11:17 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 226
Репутация: 61 ±
Замечаний: 0% ±

Excel 2013
Udik, добрый день,только почитал Вашу тему,может Вам проще так делать:

[vba]
Код
Sub test1()
Dim str1$
str1 = "мусор m1 то что надо m2 мусор"
With CreateObject("VBScript.RegExp"): .Pattern = "m1( .+ )\m2"
Debug.Print .Execute(str1)(0).Submatches(0)
End With
End Sub
[/vba]


Сообщение отредактировал sv2014 - Воскресенье, 31.01.2016, 11:17
 
Ответить
СообщениеUdik, добрый день,только почитал Вашу тему,может Вам проще так делать:

[vba]
Код
Sub test1()
Dim str1$
str1 = "мусор m1 то что надо m2 мусор"
With CreateObject("VBScript.RegExp"): .Pattern = "m1( .+ )\m2"
Debug.Print .Execute(str1)(0).Submatches(0)
End With
End Sub
[/vba]

Автор - sv2014
Дата добавления - 31.01.2016 в 11:17
Udik Дата: Воскресенье, 31.01.2016, 13:06 | Сообщение № 10
Группа: Друзья
Ранг: Старожил
Сообщений: 1588
Репутация: 192 ±
Замечаний: 0% ±

Excel 2016 х 64

хы, то что доктор прописал :)

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


вот вам барабан
яд 41001231307558 wm R419131876897
udik1968@gmail.com
 
Ответить
Сообщение
хы, то что доктор прописал :)

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

Автор - Udik
Дата добавления - 31.01.2016 в 13:06
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вытащить подстроку, расположенную между 2 шаблонами регэксп (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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