VB.Net正则表达式 - 提取通配符值

时间:2011-07-15 17:01:23

标签: regex vb.net string wildcard extraction

我需要帮助从正则表达式匹配中提取通配符的值。例如:

正则表达式:“我喜欢*”

输入:“我喜欢巧克力”

我希望能够从正则表达式匹配(或其他任何东西)中提取字符串“chocolate”。如果可能,我还希望能够从单个通配符匹配中检索多个通配符值。例如:

正则表达式:“我播放*和*”

输入:“我弹吉他和低音”

我希望能够提取“吉他”和“低音”。有办法吗?

2 个答案:

答案 0 :(得分:3)

一般来说,正则表达式使用组的概念。组用括号表示。

所以我喜欢
我会喜欢(。
)。 =所有字符*表示前面一个字符的数量

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 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,请查看此网站,其中包含一个很棒的教程。

答案 1 :(得分:0)

这是我在VBA中的RegexExtract功能。它将仅返回您指定的子匹配(仅括号中的内容)。所以在你的情况下,你会写:

 =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