预编译一个非常大的正则表达式

问题描述 投票:0回答:3

我遇到了一个非常奇怪的问题。我有一个非常大的正则表达式来搜索某些文本中的某些单词(正则表达式看起来像这样:

(?i)\b(a|b|c|d...)\b;
等等,其中 a、b、c、d 代表单词)。不管怎样,我把它放在预编译的程序集中,以加快速度,但问题是预编译的正则表达式与同一正则表达式的非编译版本的工作方式不同... o_0

例如,如果正则表达式是:

(?i)\b(he|desk)\b
并且我通过它传递“helpdesk”,预编译版本将返回“lp”,因此单词 he 和 desk 会被条纹化,就好像边界条件根本不起作用一样,但是如果我确实使用完全相同的正则表达式非预编译版本它工作得很好...... 有谁知道我是否遗漏了什么?

谢谢

(抱歉使用 VB.Net 和 C#)

c# .net regex vb.net compiled
3个回答
1
投票

既然您要搜索整个单词,那么搜索

\w+
并检查该单词是否在集合中怎么样?基于哈希的集合或哈希映射在这里可以很好地工作。如果需要的话,这种方法可以更轻松地更新列表。


0
投票

您在那里提供了两种不同的语言。所以也许会有一些互动。

无论如何,我认为一些简短但完整的测试程序可能是合适的 - 尝试在一些独立的测试代码中重现问题,以便更容易推理。

也许不使用正则表达式进行搜索会更有效?


0
投票

我编写了两个测试应用程序,一个用 C# 编写,一个用 VB.Net 编写,两者都表现出相同的行为。我使用的正则表达式的预编译版本似乎忽略了某些单词的边界条件。我尝试过不使用正则表达式,但我在表达式中有一个包含 3000 多个单词的列表,经过一些测试,它似乎是最好的解决方案,唯一的事情是我不希望它出现在我的主代码中,而是更愿意将它放在预编译的程序集...

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.