代码之家  ›  专栏  ›  技术社区  ›  Chris Kooken

匹配C中字典中的正则表达式#

  •  6
  • Chris Kooken  · 技术社区  · 15 年前

    我尝试使用某种数据对象(我在想字典)来保存大量的正则表达式作为键,然后我需要获取一个文本字符串,并与它们进行匹配以从字典中获取实际值。我需要一种有效的方法来为一组大的数据实现这一点。

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

    5 回复  |  直到 15 年前
        1
  •  8
  •   gpmcadam    15 年前

    为什么不使用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
  •  0
  •   Vinay Sajip    15 年前

    我不确定您是否真的需要正则表达式-您可以使用 trie . 表示词典是一个常用的trie应用程序。(我假设你指的是一本字典,比如一系列单词,而不是“关联数组”的意思)。

        3
  •  0
  •   LoveMeSomeCode    15 年前

    您的意思是将字符串与正则表达式匹配以获得正则表达式匹配吗?或者只是一个文本匹配?换句话说,您要成为这些regex之一的字符串,还是要应用regex的某些数据?

    如果它是一个regex,并且您希望在列表中找到它,那么您不需要字典,它们是由两部分组成的容器。您可以使用一个列表或StringCollection,并请求indexof(mytstring),-1,这意味着它不在其中。

        4
  •  0
  •   Jonathan Graehl    15 年前

    如果您的regexp不是简单的单个字符串,并且您关心效率,那么您希望将它们表示为单个字符串 NFA (nondeterministic finite-state automaton ,值处于最终状态。如果一个输入可以匹配多个regexp,那么最终状态将需要一组值。

    此时,您已经准备好考虑优化自动机。如果它实际上可以被确定(这给了你一个可以比NFA指数大的DFA),那么无论如何都要这样做。一旦您有了一个DFA,您就可以有效地(并且唯一地达到同构)最小化它(但是由于您在最终状态中有值,所以对 usual algorithm 是需要的)。

    还有一些直接最小化NFA的技术。例如,如果两个状态具有相同的后缀集((字符串的其余部分,值)),则它们是等效的,可以组合在一起。非循环NFA中的等效可以通过 hash-consing 从最终状态开始。

        5
  •  0
  •   stevehipwell    15 年前

    记住,如果您计划多次使用一个regex,您可以在编译时创建一个regex对象,并重新使用它来减少开销。

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

    使用这个模型,您最好存储一个regex对象,而不是模式字符串。