Соответствуйте Регулярному выражению из словаря в C#

Управляемые языки, такие как Java и C# не имеют этих проблем, но определенные виртуальные машины (JVM/CLR/и т.д.), которые на самом деле выполняют код, могут.

7
задан Chris Kooken 10 September 2009 в 22:26
поделиться

5 ответов

Почему бы не использовать 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.
9
ответ дан 7 December 2019 в 03:18
поделиться

Я не уверен, действительно ли вам нужны регулярные выражения для этого - вы можете использовать дерево . Представление словарей - распространенное приложение для дерева. (Я предполагаю, что вы имеете в виду словарь как список слов, а не значение "ассоциативный массив").

0
ответ дан 7 December 2019 в 03:18
поделиться

Вы имеете в виду сопоставление строки с регулярными выражениями, чтобы получить совпадение с регулярным выражением? Или просто текстовое совпадение? Другими словами, будет ли строка, которую вы собираетесь БЫТЬ, одним из этих регулярных выражений, или некоторыми данными для ПРИМЕНЕНИЯ регулярного выражения?

Если это регулярное выражение, и вы хотите найти его в списке, вам не нужен Словарь, это 2-х частные контейнеры. Вы можете просто использовать List или StringCollection и запросить IndexOf (mytString), -1 означает, что его там нет.

0
ответ дан 7 December 2019 в 03:18
поделиться

Помните, что если вы планируете использовать регулярное выражение более одного раза, вы можете создать скомпилированный объект регулярного выражения и повторно использовать его для уменьшения накладных расходов.

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

Использование этой модели будет лучшим вариантом. хранение объекта регулярного выражения, а не строки шаблона.

0
ответ дан 7 December 2019 в 03:18
поделиться

Если ваши регулярные выражения не являются тривиальными однострочными, и вы заботитесь об эффективности, вы бы хотели представить их в одном NFA (недетерминированный конечный автомат , со значениями в конечных состояниях. Если это возможно, то вход для соответствия более чем одному регулярному выражению, тогда для конечных состояний потребуется набор значений.

На этом этапе вы готовы рассмотреть возможность оптимизации автомата. Если его можно практически определить (это дает вам DFA, который может быть экспоненциально больше, чем NFA), то обязательно сделайте это. Если у вас есть DFA, вы можете эффективно (и однозначно с точностью до изоморфизма) минимизировать его (но поскольку у вас есть значения в ваших конечных состояниях, необходима очевидная модификация обычного алгоритма ).

Существуют также методы минимизации NFA прямо. Например, если два состояния имеют одинаковые наборы суффиксов ({(остальная часть строки, значение)}), они эквивалентны и могут быть объединены. Эквивалентность в ациклической NFA может быть достигнута посредством хеширования , начиная с конечных состояний.

0
ответ дан 7 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: