背景
我有一个场景,我必须一遍又一遍地在文本中找到某些单词。我目前以这样的格式使用了一系列正则表达式......
"((^)|(\W))(?<c>Word1)((\W)|($))"
"((^)|(\W))(?<c>NextWord)((\W)|($))"
"((^)|(\W))(?<c>AnotherWord)((\W)|($))"
...
这个 Regex 对象列表是用一大块数据循环的,并且匹配项被拉出(一个循环用于一个 regex.matches(data) 调用)
我已经尽我所能来优化它们,例如事先编译它们。
然而,这个列表越来越长,我决定开始制作更大的编译正则表达式来优化这个过程。如...
"((^)|(\W))(?<c>((Word1)|(NextWord)|(AnotherWord)))((\W)|($))"
这提供了巨大的速度改进,但是有一个副作用,我无法弄清楚如何纠正。
当单词并排在数据中时(例如空格分隔。例如“Word1 NextWord AnotherWord”),捕获中会丢失第二个单词,因为“Word1”的正则表达式还包括尾随空格。“NextWord”可能出现的匹配不再具有前导空格,因为它是前一个匹配的一部分。
问题
任何人都可以更改此正则表达式(.net 格式)
Pattern = "((^)|(\W))(?<c>((Word1)|(NextWord)|(AnotherWord)))((\W)|($))"
只需一次调用“.matches(data)”,即可捕获下面此列表中的所有单词
data = "Word1 NextWord AnotherWord"
? (不牺牲效率增益)
结果
只是想我会提到这一点。在应用建议的答案/更正并向前看后,我现在知道如何使用:),我刚刚修改的代码的速度提高了 347 倍(旧测试速度的 0.00347%)。当您遇到多个表达式时,这绝对是要记住的事情。很高兴。