RegEx在VBA和JavaScript中的处理方式有何不同?

How is RegEx handled differently in VBA and JavaScript?

本文关键字:方式 处理 何不同 VBA JavaScript RegEx      更新时间:2023-09-26

我在Excel VBA中使用正则表达式来解析游泳比赛的结果。该代码读取从PDF复制的一行文本,并将重要数据输出到单个单元格中。由于字符串的格式在整个源PDF中各不相同,因此正则表达式非常复杂。尽管如此,我仍然能够解析95%的数据。

一些没有被解析的行让我感到困惑。VBA显然无法找到匹配的正则表达式,但当我复制完全相同的正则表达式和字符串到这个网站,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

您能添加更多实际匹配的示例吗?例如,周围的行匹配,更好的是,不应该匹配的例子,如果有的话?

我已经尝试在正则表达式中"清理"一点,删除不用于匹配特定行的组,以使错误更加明显,并改变其中一个组的工作方式,这实际上可能解决问题:

('d*)
'.?'s?
([^,]+)
,'s
([^'d]+)
's?
('d+)
's
(
  (?:[A-Z]{3})?
)
's?
(
# OLD SOLUTION
#  (?:
#    (?!'d':'d)
#    .
#  )*
# NEW SOLUTION
  .*?
)
's?
(
  (?:'d+:)?
  'd+'.'d+
)
(?:
  's
  ('d+)
)?
$

参见regex101的示例。

然而,最让我困惑的是这一组:

(?:[A-Z]{3})?

为什么有3个字符的限制,当它只匹配街道名称中的前3个字母时?