RegEx在VBA和JavaScript中的处理方式有何不同?
How is RegEx handled differently in VBA and JavaScript?
我在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个字母时?
相关文章:
- 在承诺链中处理早期回报的最佳方式
- 如何处理javascript中的循环引用,类似于Excel提供迭代限制的方式
- 如何启用Emmet'的选项卡键处理程序(HTML快捷方式)
- 在Javascript HTML5+Canvas中处理精灵鼠标点击的最佳方式
- 如何以 Angular2 方式处理 ajaxStart 和 ajaxStop 事件
- 我怎样才能以非阻塞的方式处理数字
- 如何制作一个JavaScript函数,处理多组输入,以同样的方式进行数学处理
- React是装载前处理空对象的最佳方式
- 如何使用javascript中的间隔以顺序方式处理websocket响应
- 为什么'这'与函数对象一起使用时会有不同的处理方式
- 处理多次单击事件的最佳方式
- 用 ES6 承诺以习惯方式处理先决条件
- Internet Explorer 11 根据开发人员工具是否打开而以不同的方式处理 jQuery
- 以 MVVM 方式处理 html5 视频标签的正确方法是什么?
- 使用 jQuery 延迟对象以串行方式处理 jQuery 集合/数组
- 如何以正确的方式处理Chrome X-XSS-Protection
- 如何以编程方式处理net::ERR_INSECURE_RESPONSE
- 以RESTful的方式处理模型关系
- PubSub.js的多个订阅,或者以不同的方式处理多个回调的等待
- 在每个块的handlebas#中以不同的方式处理列表的最后一个元素