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

时间:2014-08-22 02:48:42

标签: javascript regex vba excel-vba excel

我在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

1 个答案:

答案 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+)
)?
$

See example on regex101

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

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

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