English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

التعبيرات النمطية لScala

Scala تستخدم scala.util.matching للحصول على Regex فئة لدعم تعبيرات النصوص. يوضح هذا المثال استخدام تعبيرات النصوص للبحث عن الكلمات. Scala :

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

تنفيذ الكود أعلاه، الناتج سيكون:

$ scalac Test.scala 
$ scala Test
Some(Scala)

في المثال، تم استخدام طريقة r() من فئة String لإنشاء كائن Regex.

ثم استخدم طريقة findFirstIn لتحديد الم matchة الأولى.

إذا كنت بحاجة إلى عرض جميع الم匹配ات، يمكنك استخدام طريقة findAllIn.

يمكنك استخدام طريقة mkString( ) لربط النصوص التي تم تطابقها في تعبير النصوص، ويمكنك استخدام | لتحديد نماذج مختلفة:

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // يمكن أن تكون الأحرف الأولى كبيرة أو صغيرة S أو s
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))   // تستخدم علامة الاستفهام , لربط النتائج
   }
}

تنفيذ الكود أعلاه، الناتج سيكون:

$ scalac Test.scala 
$ scala Test
Scala,scala

إذا كنت بحاجة إلى استبدال النصوص المدخلة بمفتاح مخصص، يمكنك استخدام replaceFirstIn( ) يستخدم هذا الطريقة لتبديل الم匹配ة الأولى، باستخدام replaceAllIn( ) يستخدم هذا الطريقة لتبديل جميع الم匹配ات، مثل ما يلي:

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

تنفيذ الكود أعلاه، الناتج سيكون:

$ scalac Test.scala 
$ scala Test
Java is scalable and cool

تعبيرات النصوص

تعتمد تعبيرات النصوص في Scala على قواعد جافا، والكثير من جافا يستخدم قواعد لغة Perl.

في الجدول أدناه، قمنا بتقديم بعض القواعد الشائعة للعبارات التقليدية:

التعبيرقواعد التطابق
^ تتطابق مع موضع بداية النص المدخل.
$تتطابق مع موضع نهاية النص المدخل.
.مطابق أي حرف غير "\r\n"
[...]مجموعة النصوص. تتطابق مع أي حرف من المدرج. على سبيل المثال، "[abc]" تتطابق مع "a" في "plain".
[^...]مجموعة النصوص العكسية. تتطابق مع أي حرف غير مدرج. على سبيل المثال، "[^abc]" تتطابق مع "plain" في "p"، "l"، "i"، "n".
\\Aمطابق بداية النص (بدون دعم لعدة أسطر)
\\zنهاية السلسلة (مثل $، ولكن لا يتأثر بتحويل الأعمدة)
\\Zنهاية السلسلة أو نهاية السطر (لا يتأثر بتحويل الأعمدة)
re*تكرار صفر مرة أو أكثر
re+تكرار مرة واحدة أو أكثر
re?تكرار صفر مرة أو مرة واحدة
re{ n}تكرار n مرة
re{ n,}تكرار n مرة أو أكثر
re{ n, m}تكرار n إلى m مرة
a|bمطابق a أو b
(re)مطابق re، ويتم التقاطع مع النص في المجموعة المحددة تلقائيًا
(?: re)مطابق re، دون التقاطع مع النص الم匹配، ولا تعطي هذا المجموعة رقم
(?> re)العبرة غير الجائزة
\\wمطابق الحرف أو الرقم أو الخط الفرعي أو الحرف الصيني
\\Wمطابق أي حرف غير حرف، رقم، خط فرعي، أو حرف صيني
\\sمطابق أي حرف فراغ، يساوي [\t\n\r\f]
\\Sمطابق أي حرف غير حرف فراغ
\\dمطابق الرقم، مثل [0-9]
\\Dمطابق أي حرف غير رقم
\\Gبداية البحث الحالية
\\nالخط الفاصل
\\bعادة موضع الفصل بين الكلمات، ولكن إذا تم استخدامه في مجموعة من الأحرف يمثل الرجوع للوراء
\\Bمطابق غير موقع بداية أو نهاية الكلمة
\\tالتبويب
\\Qبداية العلامة المقدسة:\Q(a+b)*3\E يمكنه تطابق النص "(a+b)*3".
\\Eنهاية العلامة المقدسة:\Q(a+b)*3\E يمكنه تطابق النص "(a+b)*3".

مثال على تعبيرات النصوص العادية

مثالالوصف
.مطابق أي حرف غير "\r\n"
[Rr]ubyمطابق "Ruby" أو "ruby"
rub[ye]مطابق "ruby" أو "rube"
[aeiou]مطابق الحروف الصغيرة :aeiou
[0-9]مطابق أي رقم، مثل [0123456789]
[a-z]مطابق أي حرف صغير ASCII
[A-Z]مطابق أي حرف كبير ASCII
[a-zA-Z0-9]مطابق الرقم، الحروف الكبيرة، الحروف الصغيرة
[^aeiou]مطابق أي حرف غير aeiou
[^0-9]مطابق أي حرف غير رقم
\\dمطابق الرقم، مثل: [0-9]
\\Dمطابق غير الرقم، مثل: [^0-9]
\\sمطابق الفضاء، مثل: [ \t\r\n\f]
\\Sمطابق غير الفضاء، مثل: [^ \t\r\n\f]
\\wمطابق الحروف، الأرقام، الخط الفرعي، مثل: [A-Za-z0-9_]
\\Wمطابق التكوين غير الحروف، الأرقام، الخط الفرعي، مثل: [^A-Za-z0-9_]
ruby?التنسيق "rub" أو "ruby": y هو اختياري
ruby*التنسيق "rub" مع 0 أو أكثر من y.
ruby+التنسيق "rub" مع 1 أو أكثر من y.
\\d{3}التنسيق 3 أرقام فقط.
\\d{3,}التنسيق 3 أو أكثر من الأرقام.
\\d{3,5}التنسيق 3 أو 4 أو 5 أرقام.
\\D\\d+بدون فرز: + تكرار \d
(\\D\\d)+/الفرز: + تكرار \D\d
([Rr]uby(, )?)+التنسيق "Ruby"، "Ruby, ruby, ruby"، وما إلى ذلك

لاحظ أن كل رمز استخدمت فيه إثنتين من الأسهم العكسية. هذا لأن الأسهم العكسية في سلاسل Java وScala هي معرفات مسبقة. لذا إذا كنت ترغب في إخراج \، يجب عليك كتابة \\ في السلسلة للحصول على سهم عكسية واحدة. انظر إلى المثال التالي:

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

تنفيذ الكود أعلاه، الناتج سيكون:

$ scalac Test.scala 
$ scala Test
able1