【问题标题】:How is RegEx handled differently in VBA and JavaScript?RegEx 在 VBA 和 JavaScript 中的处理方式有何不同?
【发布时间】: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


【解决方案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 个字母?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2018-03-21
    • 2012-06-27
    • 1970-01-01
    相关资源
    最近更新 更多