Имеется строка, внутри неё 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]
Имеется строка, внутри неё 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
Так можно же сразу, просто поставив условие "(?:.+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
SLAVICK, а зачем обратный слэш? Без него тоже пашет (или я что упустил)
[vba]
Код
Public Sub test2() Dim str1 As String, pttr1$, pttrn2$ Dim objRegExp As Object pttr1 = "(?:.+m1 | m2.+)" str1 = "мусор m1 то что надо m2 мусор" Set objRegExp = CreateObject("VBScript.RegExp") objRegExp.Pattern = pttr1 objRegExp.Global = 1 str1 = objRegExp.Replace(str1, "") Debug.Print str1 End Sub
[/vba]
SLAVICK, а зачем обратный слэш? Без него тоже пашет (или я что упустил)
[vba]
Код
Public Sub test2() Dim str1 As String, pttr1$, pttrn2$ Dim objRegExp As Object pttr1 = "(?:.+m1 | m2.+)" str1 = "мусор m1 то что надо m2 мусор" Set objRegExp = CreateObject("VBScript.RegExp") objRegExp.Pattern = pttr1 objRegExp.Global = 1 str1 = objRegExp.Replace(str1, "") Debug.Print str1 End Sub
А если банальный дабл-сплит? Или это слишком банально? [vba]
Код
Sub test3() Dim str1 As String str1 = "мусор m1 то что надо m2 мусор" str1 = Split(Split(str1, "m1 ")(1), " m2")(0) Debug.Print str1 'то что надо End Sub
[/vba]
А если банальный дабл-сплит? Или это слишком банально? [vba]
Код
Sub test3() Dim str1 As String str1 = "мусор m1 то что надо m2 мусор" str1 = Split(Split(str1, "m1 ")(1), " m2")(0) Debug.Print str1 'то что надо End Sub
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]
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
Всем спасибо, понятно, что вытащить серединку в данном случае можно многими способами, но меня заинтересовало именно получение групп. Ответ получен.Udik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com