Регулярные выражения VB.Net - извлечение значения подстановочного знака

Мне нужна помощь в извлечении значения подстановочного знака из совпадения регулярных выражений. Например:

Регулярное выражение: "мне нравится *"

Ввод: "Я люблю шоколад"

Я хотел бы иметь возможность извлечь строку «шоколад» из совпадения Regex (или чего-то еще). Если возможно, я также хочу иметь возможность извлекать несколько значений подстановочных знаков из одного совпадения с подстановочными знаками. Например:

Регулярное выражение: "Я играю * и *"

Исходные данные: «Я играю на гитаре и басу»

Я хочу иметь возможность извлекать и «гитару», и «бас». Есть способ сделать это?


person Walker    schedule 15.07.2011    source источник


Ответы (2)


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

Так что мне нравится
Хотелось бы мне (.
). = Все символы * означают столько же или ни одного из предшествующих символов

Sub Main()
    Dim s As String = "I Like hats"
    Dim rxstr As String = "I Like(.*)"
    Dim m As Match = Regex.Match(s, rxstr)
    Console.WriteLine(m.Groups(1))

End Sub

Приведенный выше код будет работать для строки с надписью I Like и распечатает все символы после включения символа '' as. соответствует даже пустому пространству.

Ваш второй случай более интересен, потому что первый rx будет соответствовать всему концу строки, вам нужно что-то более ограничительное.

Мне нравятся (\ w +) и (\ w +): это будет соответствовать I Like then a space и одному или нескольким символам слова, а затем and пробелу и one or more word characters

Sub Main()

    Dim s2 As String = "I Like hats and dogs"
    Dim rxstr2 As String = "I Like (\w+) and (\w+)"
    Dim m As Match = Regex.Match(s2, rxstr2)
    Console.WriteLine("{0} : {1}", m.Groups(1), m.Groups(2))
End Sub

Чтобы получить более полное представление о regex, посетите этот сайт, на котором есть отличное руководство.

person rerun    schedule 15.07.2011
comment
Право на. Единственное, о чем следует позаботиться, - это жадность диких карт. - person David Brunelle; 15.07.2011
comment
Спасибо, кстати, есть ли способ вернуть значение подстановочного знака так, как оно было изначально написано, если у меня включена опция IgnoreCase Regex? Пример: мне нравится GeRmAnY возвращает GeRmAnY - person Walker; 18.07.2011

Вот моя функция RegexExtract в VBA. Он вернет только указанное вами дополнительное совпадение (только то, что указано в скобках). Итак, в вашем случае вы должны написать:

 =RegexExtract(A1, "I like (.*)")

Вот код.

Function RegexExtract(ByVal text As String, _
                      ByVal extract_what As String) As String

Application.ScreenUpdating = False
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")

RE.Pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)
RegexExtract = allMatches.Item(0).submatches.Item(0)
Application.ScreenUpdating = True

End Function

Вот версия, которая позволит вам использовать несколько групп для одновременного извлечения нескольких частей:

Function RegexExtract(ByVal text As String, _
                      ByVal extract_what As String) As String

Application.ScreenUpdating = False
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
Dim i As Long
Dim result As String

RE.Pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)

For i = 0 To allMatches.Item(0).submatches.count - 1
    result = result & allMatches.Item(0).submatches.Item(i)
Next

RegexExtract = result
Application.ScreenUpdating = True

End Function
person aevanko    schedule 16.07.2011