Регулярные выражения VB.Net - Извлечение значения шаблона - PullRequest
0 голосов
/ 15 июля 2011

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

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

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

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

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

Ввод: «Я играю на гитаре и басу»

Я хочу быть в состоянии извлечь как "гитара", так и "бас". Есть ли способ сделать это?

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

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

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

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

Приведенный выше код будет работать для строки, которая имеет значение «Мне нравится», и распечатывает все символы после включения символа «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 посмотрите этот сайт, на котором есть отличный учебник.

0 голосов
/ 16 июля 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
...