سؤال

ونحن قد حصلت على السيناريو الذي يتطلب منا تحليل الكثير من البريد الإلكتروني (نص عادي) ، كل البريد الإلكتروني 'type' هو نتيجة البرنامج النصي التي يتم تشغيلها ضد منصات مختلفة.بعض تبويب محدد ، وبعضها مساحة محدد ، وبعض نحن ببساطة لا نعرف حتى الآن.

نحن بحاجة إلى دعم المزيد من صيغ' في المستقبل أيضا.

هل نذهب عن حل باستخدام:

  • Regex
  • ببساطة البحث (باستخدام السلسلة.IndexOf الخ)
  • ليكس/ Yacc
  • أخرى

الحل الشامل سيتم تطويرها في C# 2.0 (أمل 3.5)

هل كانت مفيدة؟

المحلول

ثلاثة حلول ذكرت كل تغطية احتياجات مختلفة جدا.

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

Regex هي أرضية مشتركة ، وربما أفضل رهان هنا.فهي قوية مرنة حتى الآن كما يمكنك إضافة نفسك المنطق أكثر من رمز الاتصال المختلفة regex.العيب الرئيسي سيكون السرعة هنا.

ليكس/Yacc هو حقا فقط تكييفها معقدة جدا ويمكن التنبؤ بها جمل و يفتقر إلى الكثير من وظيفة تجميع المرونة.لا يمكنك بسهولة تغيير محلل في منتصف تحليل, في الواقع يمكنك لكنه مجرد ثقيلة جدا و ستكون أفضل باستخدام التعابير المنطقية بدلا من ذلك.

أعرف أن هذا هو مبتذل الجواب, كل شيء يأتي في الواقع إلى ما احتياجاتك بدقة ، ولكن من ما قلته أنا شخصيا ربما تذهب مع كيس من regex.

كما البديل, كما Vaibhav poionted ، إذا كان لديك العديد من الحالات المختلفة التي يمكن أن تنشأ وأن كنت cna بسهولة اكتشاف أي واحد يأتي ، هل يمكن جعل البرنامج المساعد النظام أن يختار الحق الخوارزمية و تلك الخوارزميات يمكن أن تكون مختلفة جدا ، واحدة باستخدام ليكس/Yacc في مدبب حالات أخرى باستخدام IndexOf و regex عن أبسط الحالات.

نصائح أخرى

Regex.

Regex يمكن أن تحل كل شيء تقريبا إلا من أجل السلام في العالم.ربما السلام العالمي أيضا.

ربما ينبغي أن يكون للتوصيل النظام بغض النظر عن أي نوع من سلسلة تحليل تستخدمها.هذا النظام يدعو إلى الحق 'البرنامج المساعد' اعتمادا على نوع من البريد الإلكتروني لتحليل ذلك.

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

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

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

عندما يعرف موزعي لا يمكن التعامل مع هذه المهمة ، إنشاء DLL جديد مع الأنواع التي تنفذ محلل و معرف الواجهات التي يمكن التعامل مع هذه المهمة وإسقاط لهم في bin.

ذلك يعتمد على ما كنت تحليل.أي شيء يتجاوز ما Regex يمكن التعامل معها ، لقد تم استخدام ANTLR.قبل أن تقفز إلى العودية النسب تحليل للمرة الأولى ، أود أن البحث وكيفية عملها ، قبل محاولة استخدام إطار مثل هذا واحد.إذا كنت الاشتراك في MSDN مجلة, مراجعة فبراير 2008 العدد حيث لديهم مقال على الكتابة من نقطة الصفر.

بمجرد الحصول على الفهم والتعلم ANTLR سوف يكون الكثير أسهل.هناك أطر أخرى هناك ، ولكن ANTLR يبدو أن لديها أكثر من دعم المجتمع و الوثائق العامة.صاحب البلاغ قد نشرت أيضا نهائي ANTLR المرجعية:بناء المجال-لغات معينة.

Regex ربما تكون أنت بس الرهان ، حاولت وثبت.بالإضافة إلى التعبير العادي يمكن جمعها.

أفضل رهان هو RegEx لأنه يوفر درجة أكبر من المرونة من أي من الخيارات الأخرى.

بينما يمكن استخدام IndexOf إلى التعامل مع الأشياء ، قد تجد نفسك بسرعة كتابة التعليمات البرمجية التي تبدو مثل:

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

التي يمكن التعامل معها في أحد RegEx البيان.بالإضافة إلى أن هناك الكثير من الأماكن مثل RegExLib.com حيث يمكنك أن تجد الناس الذين تقاسمت التعبيرات العادية لحل المشاكل.

@Coincoin وقد غطت القواعد ؛ أنا فقط أريد أن أضيف أن مع regex انها سهلة خاصة أن ينتهي من الصعب قراءة ، من الصعب الحفاظ على التعليمات البرمجية.Regex قوية جدا المدمجة اللغة, هكذا يذهب كثير من الأحيان.

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

استخدام PCRE.جميع الإجابات فقط 2 أفضل.

مع القليل من المعلومات التي قدمتها ، وأود أن اختيار التعابير المنطقية.

ولكن ما نوع المعلومات التي تريد تحليل ما كنت تريد أن تفعل تغيير قرار ليكس/Yacc ربما..

ولكن يبدو أنك قد اتخذت قرارك مع سلسلة البحث :)

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