Извлекать текст из строки, начинающейся и заканчивающейся определенным символом

#vba

#vba

Вопрос:

У меня есть приведенный ниже код, который извлекает строку из скобок, и все в порядке, но теперь я обнаружил, что иногда в моей строке может быть больше скобок с текстом позади, и мне нужно их тоже извлечь. Например, список или таблица.

например

 hsus(irt)bla dsd (got)(rifk)
  

Тогда мне нужно: irt, got, rifk в список, как это сделать?

 Public Function extract_value(str As String) As String
dim str as string
dim openPos as integer
dim closePos as integer
dim midBit as string

str = "sometinhf(HELLO)sds"
openPos = instr (str, "(")
closePos = instr (str, ")")
midBit = mid (str, openPos 1, closePos - openPos - 1)
End Function
  

Ответ №1:

 Sub Main()

    Dim s$
    s = "hsus(irt)bla dsd (got)(rifk)"

    Debug.Print extract_value(s)

End Sub

Public Function extract_value$(s$)

    Dim returnS$
    Dim v
    v = Split(s, Chr(40))

    For Each Item In v
        If InStr(Item, Chr(41)) Then
            returnS = returnS amp; Chr(32) amp; Split(Item, ")")(0)
        End If
    Next

    extract_value = Trim$(returnS)
End Function
  

Комментарии:

1.Хорошо, вы были довольно быстры. Вы знаете, насколько быстрее, чем Mid(params) Split(params) разделить строку?

2. @smagnan никогда не измерял это. вы считаете, что это плохой подход?

3. Вы имеете в виду использование Mid вместо Split ? Я полагаю, что это действительно не лучший подход, поскольку Mid используется для извлечения подстрок… но поскольку я совсем новичок в VBA, я все еще не знаю многих функций

4. Split() разбивает всю строку на массив Variant / String на основе разделителя. Таким образом, с помощью Split() вы уже ограничиваете длину строки, к которой Mid() придется перейти, чтобы извлечь подстроку. Поскольку v в памяти всего несколько слов, теперь вы проверяете, есть ли в каждом из слов ) . Если это не так, вы пропускаете это слово, и если это так, вы снова используете разделение с другим разделителем, как отредактированный код, вместо Mid, который в этом случае был бы медленнее

5. @ me как, это было быстро! :)… @smagnan, я считаю, Split что операция со строками должна быть немного быстрее, поскольку выделение отдельных строк непосредственно в VBA является медленным процессом.

Ответ №2:

Вы можете использовать Regexp для извлечения соответствующих строк напрямую

 Sub Main()
    Dim strTest as string
    strTest = "hsus(irt)bla dsd (got)(rifk)"
    MsgBox GrabIt(strTest)
End Sub

Function GrabIt(strIn As String) As String
Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Pattern = "((.*?))"
.Global = True
    If .test(strIn) Then
    Set objRegMC = .Execute(strIn)
        For Each objRegM In objRegMC
        GrabIt = GrabIt amp; Chr(32) amp; objRegM.submatches(0)
        Next
    End If
End With
End Function