سؤال

أحاول الحصول على نوع من كائنات البيانات (أفكر في قاموس) للاحتفاظ بعدد كبير من التعبيرات العادية كمفاتيح، ثم أحتاج إلى أخذ سلسلة من النص ومطابقتها للحصول على القيمة الفعلية من القاموس .أحتاج إلى طريقة فعالة للقيام بذلك لمجموعة كبيرة من البيانات.

أنا في 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.

نصائح أخرى

لست متأكدًا مما إذا كنت تحتاج بالفعل إلى تعبيرات عادية لهذا - يمكنك استخدام ملف حاول.يعد تمثيل القواميس تطبيقًا شائعًا للمحاولة.(أفترض أنك تقصد قاموسًا كما في قائمة الكلمات، وليس معنى "المصفوفة النقابية").

هل يعني تطابق سلسلة ضد regexes للحصول على مباراة التعابير المنطقية؟ أو مجرد تطابق النص؟ وبعبارة أخرى، هو سلسلة لديك سيكون واحدا من تلك regexes، أو بعض البيانات إلى تطبيق التعابير المنطقية ل؟

وإذا كانت التعابير المنطقية وتريد للعثور عليه في القائمة، أنت لا تحتاج إلى قاموس، وتلك هي 2 حاويات جزء. هل يمكن أن مجرد استخدام قائمة أو StringCollection، وطلب IndexOf (mytString)، -1 وهذا يعني أنه ليس هناك.

إذا لم تكن التعبيرات العادية الخاصة بك عبارة عن سلاسل مفردة تافهة، وكنت تهتم بالكفاءة، فقد ترغب في تمثيلها في مفردة واحدة NFA (أتمتة الحالة المحدودة غير الحتمية, ، مع القيم في الحالات النهائية.إذا كان من الممكن أن يتطابق الإدخال مع أكثر من تعبير عادي، فستحتاج الحالات النهائية إلى مجموعة من القيم.

عند هذه النقطة، أنت على استعداد للنظر في تحسين الإنسان.إذا كان من الممكن تحديده عمليًا (يمنحك هذا DFA الذي يمكن أن يكون أكبر بشكل كبير من NFA)، فافعل ذلك بكل الوسائل.بمجرد حصولك على DFA، يمكنك تقليله بكفاءة (وبشكل فريد يصل إلى التماثل) (ولكن بما أن لديك قيمًا في حالاتك النهائية، فإن التعديل الواضح لـ الخوارزمية المعتادة وهناك حاجة).

هناك أيضًا تقنيات لتقليل NFA مباشرةً.على سبيل المثال، إذا كانت هناك حالتان لهما نفس مجموعات اللاحقة ({(بقية السلسلة،القيمة)}) فإنهما متساويتان ويمكن دمجهما.يمكن إجراء التكافؤ في NFA غير الحلقي عبر تجزئة-consing بدءاً من الحالات النهائية.

وتذكر أنه إذا كنت تخطط لاستخدام التعابير المنطقية أكثر من مرة واحدة يمكنك إنشاء كائن رجإكس كما تجميعها وإعادة استخدامها للحد من النفقات العامة.

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

وباستخدام هذا النموذج الذي سيكون من الأفضل تخزين كائن باستخدام التعابير المنطقية بدلا من سلسلة النمط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top