VBA和JavaScript中如何处理正则表达式的区别?

6
我正在使用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

我也尝试了你那个"whooper级别"的正则表达式,并得到了几个匹配项(来自所有捕获组)这里。虽然它确实与你在这里展示的字符串匹配,但是真实数据是否可能在字符串开头或结尾有一些看不见的空格字符? - Matt
我早先检查了空格问题,没有发现任何问题。以上我贴出的特定字符串肯定不包含任何前导或后续空格。 - carpiediem
非匹配行中是否存在重音字符?有些字符集有多种空格类型。不间断空格(通常在URL中编码为“ ”)就是其中之一。我会检查与不匹配的每行中的所有字符代码。 - AdrianHHH
“12. NUNEZ CHENG, Walter 74 Club Tennis Las Terr 3:44.57 123” 不匹配,也没有任何特殊字符或  。尽管巧合的是,如果 Núñez 拼写正确,它将具有特殊字符。 - carpiediem
1个回答

1
请问能否增加更多实际匹配的示例?例如,匹配的周围行,最好提供不匹配的示例(如果有的话)?
我已经尝试过在正则表达式中进行“清理”,删除未用于匹配特定行的组,以使错误更加明显,并更改了其中一个组的工作方式,这可能会解决问题。
(\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})?

为什么要限制只匹配街道名称的前三个字母,而不是全部匹配?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接