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

Вход

Регистрация

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

 

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

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Вытащить подстроку, расположенную между 2 шаблонами регэксп (Макросы/Sub)
Вытащить подстроку, расположенную между 2 шаблонами регэксп
Udik Дата: Суббота, 30.01.2016, 15:05 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1298
Репутация: 161 ±
Замечаний: 0% ±

Excel 2013
Имеется строка, внутри неё 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(16Kb)


вот вам барабан
яд 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
Группа: Модераторы
Ранг: Старожил
Сообщений: 1923
Репутация: 650 ±
Замечаний: 0% ±

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

Так можно же сразу, просто поставив условие "(?:.+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
Группа: Друзья
Ранг: Старожил
Сообщений: 1298
Репутация: 161 ±
Замечаний: 0% ±

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


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

Автор - Udik
Дата добавления - 30.01.2016 в 20:13
buchlotnik Дата: Суббота, 30.01.2016, 20:24 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 2203
Репутация: 659 ±
Замечаний: 0% ±

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


платная помощь:
ЯД: 410012595572239; WM: 311017577133
buchlotnik@mail.ru


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

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

2007,2010,2013,2016
Без него тоже пашет (или я что упустил)

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


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

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

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

Excel 2013
Нашел то что мне надо, но у меня сегодня мозг тупит. Как получить значение 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(17Kb) · 6744076.jpg(21Kb)


вот вам барабан
яд 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
Группа: Друзья
Ранг: Обитатель
Сообщений: 330
Репутация: 179 ±
Замечаний: 0% ±

Excel 2007
Оно?
[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
Группа: Друзья
Ранг: Старожил
Сообщений: 1253
Репутация: 490 ±
Замечаний: 0% ±

начинал с Excel 4.0...
А если банальный дабл-сплит? Или это слишком банально?
[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
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 157
Репутация: 37 ±
Замечаний: 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
Группа: Друзья
Ранг: Старожил
Сообщений: 1298
Репутация: 161 ±
Замечаний: 0% ±

Excel 2013

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

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


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

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

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

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