كيفية استخراج بريد إلكتروني صالح من سلسلة أكبر في Scala

StackOverflow https://stackoverflow.com/questions/2846025

  •  27-09-2019
  •  | 
  •  

سؤال

إصدار Scala الخاص بي 2.7.7

أنا أحاول استخراج بريد إلكتروني من سلسلة أكبر. السلسلة نفسها لا تتبع أي تنسيق. الرمز الذي لدي:

import scala.util.matching.Regex
import scala.util.matching._
val Reg = """\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
"yo my name is joe : joe@gmail.com" match {
    case Reg(e) => println("match: " + e)
    case _ => println("fail")
}

يمر Regex في regexbuilder ولكنه لا يمر إلى Scala. أيضًا إذا كانت هناك طريقة أخرى للقيام بذلك دون regex ، فسيكون ذلك جيدًا أيضًا. شكرًا!

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

المحلول

كما أشار آلان مور ، تحتاج إلى إضافة (?i) إلى بداية النمط لجعله غير حساس للحالة. لاحظ أيضًا أن استخدام Regex يتطابق مباشرة مع السلسلة بأكملها. إذا كنت ترغب في العثور على واحدة داخل سلسلة أكبر ، يمكنك الاتصال findFirstIn() أو استخدم إحدى الطرق المماثلة لـ Regex.

val reg = """(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r
reg findFirstIn "yo my name is joe : joe@gmail.com"  match {
    case Some(email) => println("match: " + email)
    case None => println("fail")
}

نصائح أخرى

يبدو أنك تحاول إجراء بحث غير حساس للحالة ، لكنك لا تحدد ذلك في أي مكان. حاول إضافة (?i) إلى بداية Regex:

"""(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b""".r

حسنًا ، ربما تكون طرق القيام بذلك بخلاف الدقة أكثر فوضى. من المحتمل أن تكون الخطوة التالية لأعلى محللًا Combinator. سيكون الكثير من رمز تشريح السلسلة العشوائي أكثر عمومية وبالتأكيد تقريبًا أكثر إيلامًا. يعتمد ما هو التكتيك المناسب جزئيًا على مدى اكتمال (ومدى ارتباطه أو التساهل) أن يكون معرف التعرف الخاص بك. على سبيل المثال ، الشكل المشترك: Rudolf Reindeer <rudy.caribou@north_pole.rth> لا يتم قبوله من قبل Re الخاص بك (حتى بعد استرخاء الحساسية). يعد التحليل الكامل RFC 2822 تحديًا أمرًا صعبًا لنهج قائم على إعادة القائمة.

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