我需要帮助从正则表达式匹配中提取通配符的值。例如:
正则表达式:“我喜欢*”
输入:“我喜欢巧克力”
我希望能够从正则表达式匹配(或其他任何东西)中提取字符串“chocolate”。如果可能,我还希望能够从单个通配符匹配中检索多个通配符值。例如:
正则表达式:“我播放*和*”
输入:“我弹吉他和低音”
我希望能够提取“吉他”和“低音”。有办法吗?
答案 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