我在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
答案 0 :(得分:1)
您能为实际匹配的内容添加更多示例吗?例如。匹配的周围线条,更好的是,如果有任何不匹配的例子?
我已经尝试过"清洁"正则表达式,删除不用于匹配该特定行的组,使错误更明显,并更改其中一个组的工作方式,这可能实际解决问题:
(\d*)
\.?\s?
([^,]+)
,\s
([^\d]+)
\s?
(\d+)
\s
(
(?:[A-Z]{3})?
)
\s?
(
# OLD SOLUTION
# (?:
# (?!\d\:\d)
# .
# )*
# NEW SOLUTION
.*?
)
\s?
(
(?:\d+:)?
\d+\.\d+
)
(?:
\s
(\d+)
)?
$
然而,最令我困惑的是这一组:
(?:[A-Z]{3})?
为什么3个字符限制,只与街道名称中的前3个字母匹配?