2009-09-10 2 views
5

Я пытаюсь иметь какой-то объект данных (я думаю, словарь), чтобы удерживать TON регулярных выражений в качестве ключей, тогда мне нужно взять строку текста и сопоставлять их с тем, чтобы получить фактическое значение из Словаря. Мне нужен эффективный способ сделать это для большого набора данных.Match Регулярное выражение из словаря в C#

Я нахожусь на C#, и я не уверен, с чего начать.

+0

Основываясь на ответах на данный момент, вы можете указать более подробные сведения о своем конкретном приложении. –

+1

Примерно, сколько выражений в тонне? Насколько велика будет текст, который они будут сопоставлять? Как часто будет предоставляться новый текст? Как быстро результаты должны быть возвращены? – TrueWill

ответ

7

Почему бы не использовать 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. 
+0

Я собираюсь начать с этого решения, пока он работает довольно быстро со словарем около 500 предметов. Если будет хуже, я рассмотрю другие альтернативы. Благодаря! –

0

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

0

Вы хотите совместить строки с regexes, чтобы получить регулярное выражение? Или просто текстовое совпадение? Другими словами, это строка, в которой вы собираетесь использовать одно из этих регулярных выражений, или некоторые данные для APPLY regex?

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

0

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

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

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

0

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

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

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

Смежные вопросы