我正在尝试使用某种数据对象(我在想字典)来保存正则表达式的TON作为键,然后我需要获取一串文本,然后匹配它们以获得实际值来自字典。我需要一种有效的方法来处理大量数据。

我在C#,我不知道从哪里开始。

有帮助吗?

解决方案

为什么不使用LINQ?

Dictionary<string, string> myCollection = new Dictionary<string, string>();

myCollection.Add("(.*)orange(.*)", "Oranges are a fruit.");
myCollection.Add("(.*)apple(.*)", "Apples have pips.");
myCollection.Add("(.*)dog(.*)", "Dogs are mammals.");
// ...

string input = "tell me about apples and oranges";

var results = from result in myCollection
              where Regex.Match(input, result.Key, RegexOptions.Singleline).Success
              select result;

foreach (var result in results)
{
    Console.WriteLine(result.Value);
}

// OUTPUT:
//
// Oranges are a fruit.
// Apples have pips.

其他提示

你的意思是匹配正则表达式的字符串以获得正则表达式匹配?或者只是文字匹配?换句话说,你要成为其中一个正则表达式的字符串,还是要将正则表达式应用到的一些数据?

如果它是一个正则表达式并且你想在列表中找到它,你不需要一个字典,那些是2部分容器。您可以使用List或StringCollection,并询问IndexOf(mytString),-1表示它不在那里。

如果您的正则表达式不是简单的单字符串,并且您关心效率,那么您需要将它们表示为单个 NFA(非确定性有限状态自动机,其值为最终状态。如果输入可能匹配多个正则表达式,则最终状态需要一组值。

此时,您已准备好考虑优化自动机。如果它可以实际确定(这给你一个可以指数大于NFA的DFA),那么一定要做到这一点。一旦你有了DFA,你就可以有效地(并且唯一地达到同构)最小化它(但是因为你在最终状态中有值,所以通常的算法是必需的。)

还有一些技术可以直接减少NFA。例如,如果两个状态具有相同的后缀集({(其余字符串,值)}),则它们是等效的并且可以组合。非循环NFA中的等效性可以从最终状态开始,通过 hash-consing 完成。

请记住,如果您计划多次使用正则表达式,则可以在编译时创建正则表达式对象并重新使用它以减少开销。

Regex RegexObject = new Regex(Pattern, RegexOptions.Compiled);

使用此模型最好存储正则表达式对象而不是模式字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top