就我个人而言,我不认为 30 对于正则表达式来说特别大,所以我不会太快排除它。您可以使用一行代码创建正则表达式:
var acronyms = new[] { "AB", "BC", "CD", "ZZAB" };
var regex = new Regex(string.Join("|", acronyms), RegexOptions.Compiled);
for (var match = regex.Match("ZZZABCDZZZ"); match.Success; match = match.NextMatch())
Console.WriteLine(match.Value);
// returns AB and CD
所以代码比较优雅和可维护。如果您知道首字母缩略词数量的上限,我会进行一些测试,谁知道正则表达式引擎中已经内置了什么样的优化。您还可以从未来的正则表达式引擎优化中免费受益。除非您有理由相信性能将是一个问题,否则请保持简单。
另一方面,正则表达式可能有其他限制,例如默认情况下,如果您有首字母缩写词 AB、BC 和 CD,那么它只会返回其中两个作为“ABCD”中的匹配项。所以它很擅长告诉你有一个首字母缩写词,但你需要小心捕捉多个匹配项。
当性能成为我的问题(> 10,000 个项目)时,我将“首字母缩略词”放在 HashSet 中,然后搜索文本的每个子字符串(从最小首字母缩写词长度到最大首字母缩写词长度)。这对我来说没问题,因为源文本很短。我以前没有听说过,但乍一看,你提到的问题中提到的 Aho-Corasick 算法似乎是解决这个问题的更好的通用解决方案。