【发布时间】:2014-08-22 02:48:42
【问题描述】:
我在 Excel VBA 中使用正则表达式来解析游泳比赛的结果。该代码读取从 PDF 复制的一行文本,并将重要数据输出到单个单元格中。由于整个源 PDF 中字符串的格式各不相同,因此正则表达式非常复杂。尽管如此,我仍然能够解析 95% 的数据。
不过,一些没有被解析的行让我很困惑。 VBA 显然无法找到与正则表达式的匹配项,但是当我将完全相同的正则表达式和字符串复制到 this website 时,JavaScript 能够毫无问题地找到匹配项。 VBA 和 JavaScript 处理正则表达式的方式有什么不同吗?
这是 VBA 拒绝匹配的字符串:
12. NUNEZ CHENG, Walter 74 Club Tennis Las Terr 3:44.57 123
这是我在 Excel 中使用的函数(大部分成功):
Function singleLineResults(SourceString As String) As Variant
Dim cSubmatches As Variant
Dim collectionArray(11) As String
Dim cnt As Integer
Dim oMatches As MatchCollection
With New RegExp
.MultiLine = MultiLine
.IgnoreCase = IgnoreCase
.Global = False
'1. JAROSOVA, Lenka 27 Swimmpower Prague 2:26.65 605 34.45 37.70 37.79 36.71
.Pattern = "(\d*)\.?\s?([^,]+),\s([^\d]+)\s?(\d+)\s((?:[A-Z]{3})?)\s?((?:(?!\d\:\d).)*)\s?((?:\d+:)?\d+\.\d+)(?:\s(\d+))?(?:\s((?:\d+:)?\d+.\d+))?(?:\s((?:\d+:)?\d+.\d+))?(?:\s((?:\d+:)?\d+.\d+))?(?:\s((?:\d+:)?\d+.\d+))?(?:Splash Meet Manager 11, Build \d{5} Registered to [\w\s]+ 2014-08-\d+ \d+:\d+ - Page \d+)?$"
Set oMatches = .Execute(SourceString)
If oMatches.Count > 0 Then
For Each submatch In oMatches(0).SubMatches
collectionArray(cnt) = submatch '.Value
cnt = cnt + 1
Next
Else
singleLineResults = Null
End If
End With
singleLineResults = collectionArray()
End Function
【问题讨论】:
-
我还尝试了你的正则表达式并得到了几个匹配项(来自所有捕获组)here。虽然它确实与您在此处显示的字符串匹配,但实际数据是否可能在字符串的开头或结尾有一些您看不到的空白字符?
-
我很早就检查了空格问题,但没有找到任何东西。我在上面发布的特定字符串肯定不包含任何前导或尾随空格。
-
不匹配的行中有重音字符吗?一些字符集有不止一种类型的空格。不间断空格(通常在 URL 中编码为“ ”)是一。我会检查不匹配的行中所有内容的字符代码。
-
"12. NUNEZ CHENG, Walter 74 Club Tennis Las Terr 3:44.57 123" 不匹配,并且没有任何特殊字符或 。虽然巧合的是,如果 Núñez 拼写正确,它会有一个特殊字符。
标签: javascript regex vba excel