Apidog

منصة تطوير API تعاونية متكاملة

تصميم API

توثيق API

تصحيح أخطاء API

محاكاة API

اختبار API الآلي

تعابير روبي النمطية: شرح واضح

@apidog

@apidog

Updated on مارس 28, 2025

التعبيرات العادية، التي غالبًا ما يُختصر اسمها إلى regex أو regexp، هي أدوات قوية للعمل مع أنماط النصوص في روبي. تسمح لك بالبحث ومطابقة واستخراج والتلاعب بالسلاسل النصية بناءً على أنماط محددة. سواء كنت تتحقق من إدخال المستخدم، أو تقوم بتحليل البيانات، أو تقوم بمعالجة نصوص معقدة، توفر تعبيرات روبي العادية حلاً مختصراً ومرناً.

ستوجهك هذه الدورة التدريبية عبر أساسيات التعبيرات العادية في روبي، بدءًا من بناء الجملة الأساسية إلى التقنيات المتقدمة.


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

يجمع Apidog بين توثيق واجهات برمجة التطبيقات، وتصحيح الأخطاء، والاختبارات الآلية، والمحاكاة في منصة واحدة متكاملة، مما يوفر تجربة أكثر تماسكًا مقارنة بنهج Postman المجزأ.

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

سيقدر مطورو روبي دعم Apidog القوي للتلقائية من خلال واجهته الأوامر، والتكامل السلس مع Git للتحكم في الإصدارات، والتوافق المتفوق مع OpenAPI/Swagger—وهو أمر ضروري للحفاظ على توثيق دقيق بجانب تطبيقات روبي الخاصة بك.

سواء كنت تبني خدمات RESTful باستخدام Rails أو تنشئ خدمات صغيرة باستخدام Sinatra، فإن مجموعة أدوات Apidog الشاملة تزيل تبديل السياق الذي يعاني منه مستخدمو Postman، مما يتيح لك التركيز على ما هو أهم: كتابة رمز روبي رائع.

زر

إنشاء تعبيرات عادية في روبي

في روبي، هناك عدة طرق لإنشاء تعبيرات عادية:

الطريقة 1: استخدام الشرطتين في التعبيرات العادية في روبي

أكثر الطرق شيوعًا لإنشاء تعبير عادي في روبي هي إحاطة النمط بين شرطتين مائلتين:

/Ruby/  # ينشئ تعبيرًا عاديًا يطابق "Ruby"

الطريقة 2: استخدام تدوين النسبة للتعبيرات العادية في روبي

يمكنك أيضًا استخدام تدوين النسبة مع المؤشر %r:

%r(Ruby)  # نفس الشيء كـ /Ruby/

هذا مفيد بشكل خاص عندما يحتوي نمطك على العديد من الشرطتين المائلتين، حيث يساعد على تجنب التهرب الزائد.

الطريقة 3: استخدام فئة Regexp للتعبيرات العادية في روبي

نهج آخر هو استخدام منشئ Regexp.new:

Regexp.new("Ruby")  # نفس الشيء كـ /Ruby/

تنشئ جميع هذه الطرق مثيلات من فئة Regexp.

رموز التعبيرات العادية الأساسية في روبي

تستخدم التعبيرات العادية في روبي رموزًا خاصة لتمثيل أنماط مختلفة. إليك الرموز الأساسية:

الرمز الوصف مثال يتطابق مع
. يتطابق مع أي حرف فردي /a.b/ "axb"، "a2b"، "a b"
* يتطابق مع 0 أو أكثر من العنصر السابق /ab*c/ "ac"، "abc"، "abbc"
+ يتطابق مع 1 أو أكثر من العنصر السابق /ab+c/ "abc"، "abbc"، "abbbc"
? يتطابق مع 0 أو 1 من العنصر السابق /ab?c/ "ac"، "abc"
\| التبادلية (أو) /cat\|dog/ "cat"، "dog"
[] فئة الأحرف - تتطابق مع أي حرف مدرج /[aeiou]/ "a"، "e"، "i"، "o"، "u"
() تنشئ مجموعة التقاط /(abc)+/ "abc"، "abcabc"
^ يتطابق مع بداية السلسلة النصية /^start/ "بداية السلسلة النصية"
$ يتطابق مع نهاية السلسلة النصية /end$/ "النهاية"
\\\\ يهرب حرفًا خاصًا /\\\\\\\\/ "\"

الأحرف الخاصة في التعبيرات العادية في روبي

تتضمن التعبيرات العادية في روبي فئات أحرف محددة مسبقًا تجعل مطابقة الأنماط أكثر سهولة:

الرمز الوصف مثال يتطابق مع
\\\\d يتطابق مع أي رقم (0-9) /\\\\d+/ "123"، "9"
\\\\D يتطابق مع أي حرف غير رقمي /\\\\D+/ "abc"، "!@#"
\\\\w يتطابق مع أي حرف من كلمة (أبجدي رقمي + خط سُفلي) /\\\\w+/ "ruby123"، "user_name"
\\\\W يتطابق مع أي حرف غير حرف كلمة /\\\\W+/ "!@#"، " "
\\\\s يتطابق مع أي حرف فراغ /\\\\s+/ " "، "\t"، "\n"
\\\\S يتطابق مع أي حرف غير فراغ /\\\\S+/ "hello"، "123"
\\\\A يتطابق مع بداية سلسلة نصية /\\\\AHello/ "Hello world"
\\\\z يتطابق مع نهاية سلسلة نصية /world\\\\z/ "Hello world"
\\\\Z يتطابق مع نهاية سلسلة نصية أو قبل السطر النهائي الأخير /world\\\\Z/ "Hello world\n"

المحددات في التعبيرات العادية في روبي

تسمح لك المحددات بتحديد عدد مرات تطابق نمط:

المحدد الوصف مثال يتطابق مع
* 0 أو أكثر من التكرارات /ab*c/ "ac"، "abc"، "abbc"
+ 1 أو أكثر من التكرارات /ab+c/ "abc"، "abbc"
? 0 أو 1 تكرار /colou?r/ "color"، "colour"
{n} تكرارات بالضبط n /a{3}/ "aaa"
{n,} على الأقل n تكرارات /a{2,}/ "aa"، "aaa"، "aaaa"
{n,m} بين n و m تكرارات /a{2,4}/ "aa"، "aaa"، "aaaa"

على سبيل المثال، لمطابقة تنسيق رقم هاتف مثل "123-456-7890"، يمكنك استخدام:

/\\\\d{3}-\\\\d{3}-\\\\d{4}/

مطابقة الأنماط باستخدام التعبيرات العادية في روبي

استخدام عامل المطابقة في التعبيرات العادية في روبي

أكثر الطرق الأساسية للتحقق مما إذا كان نمط يطابق سلسلة نصية هي استخدام عامل =~:

text = "The quick brown fox"
if /quick/ =~ text
  puts "تم العثور على مطابقة في الفهرس #{$~.begin(0)}"
else
  puts "لم يتم العثور على مطابقة"
end

يُرجع عامل =~ فهرس المطابقة الأولى أو nil إذا لم يتم العثور على مطابقة. بعد مطابقة ناجحة، يمكنك استخدام Regexp.last_match أو المتغير العالمي $~ للوصول إلى معلومات حول المطابقة.

مجموعات الالتقاط في التعبيرات العادية في روبي

يمكنك استخدام الأقواس لإنشاء مجموعات التقاط واستخراج أجزاء محددة من المطابقة:

text = "Name: John, Age: 30"
if match_data = /Name: (\\\\w+), Age: (\\\\d+)/.match(text)
  name = match_data[1]  # أول مجموعة التقاط
  age = match_data[2]   # المجموعة الثانية للتقاط
  puts "الاسم: #{name}، العمر: #{age}"
end

استخراج المحتوى المتطابق في التعبيرات العادية في روبي

لاستخراج كل حالات نمط معين، استخدم طريقة scan:

text = "اتصل بنا على support@example.com أو info@example.org"
emails = text.scan(/\\\\w+@\\\\w+\\\\.\\\\w+/)
puts emails.inspect  # ["support@example.com"، "info@example.org"]

العمل مع التعبيرات العادية في روبي في الممارسة العملية

استبدال النص باستخدام التعبيرات العادية في روبي

تسمح لك طريقة gsub باستبدال جميع حالات نمط معين بسلسلة نصية محددة:

text = "تفاحة موز تفاحة"
new_text = text.gsub(/apple/, "برتقال")
puts new_text  # "برتقال موز برتقال"

يمكنك أيضًا استخدم كتلة لاستبدالات أكثر تعقيدًا:

text = "السعر هو $10"
new_text = text.gsub(/\\\\$(\\\\d+)/) do |match|
  "$#{$1.to_i * 1.1}"  # زيادة السعر بنسبة 10%
end
puts new_text  # "السعر هو $11"

التبادلية في التعبيرات العادية في روبي

يسمح لك رمز العمود (|) بمطابقة نمط واحد أو آخر:

/cat|dog/.match("لدي قطة")  # يتطابق مع "قطة"
/cat|dog/.match("لدي كلب")  # يتطابق مع "كلب"

يمكنك استخدام الأقواس لتجميع البدائل:

/(تفاحة|موز) فطيرة/.match("أحب فطيرة التفاح")  # يتطابق مع "فطيرة التفاح"

فئات الأحرف في التعبيرات العادية في روبي

تتيح لك فئات الأحرف مطابقة أي حرف فردي من مجموعة:

/[aeiou]/.match("مرحبًا")  # يتطابق مع "e"
/[0-9]/.match("العميل007")  # يتطابق مع "0"

يمكنك أيضًا نفي فئة الأحرف:

/[^0-9]/.match("العميل007")  # يتطابق مع "a"

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

بدء وانتهاء المطابقات في التعبيرات العادية في روبي

يوفر روبي طرقًا ملائمة للتحقق مما إذا كانت سلسلة نصية تبدأ أو تنتهي بنمط معين:

"مرحبًا، العالم!".start_with?("مرحبًا")  # صحيح
"مرحبًا، العالم!".end_with?("العالم!")   # صحيح

بينما ليست هذه الطرق مبنية على التعبيرات العادية، إلا أنها غالبًا ما تستخدم جنبًا إلى جنب مع التعبيرات العادية لأغراض معالجة النصوص.

المتغيرات العالمية في التعبيرات العادية في روبي

بعد مطابقة ناجحة، يقوم روبي بتعيين عدة متغيرات عالمية:

  • $& - النص الكامل المتطابق
  • $`` - جزء من السلسلة قبل المطابقة
  • $' - جزء من السلسلة بعد المطابقة
/bb/ =~ "aabbcc"
puts $`   # "aa"
puts $&   # "bb"
puts $'   # "cc"

المعدلات للتعبيرات العادية في روبي

تدعم التعبيرات العادية في روبي مجموعة متنوعة من المعدلات التي تغير كيفية تفسير الأنماط:

المعدل الوصف مثال
i مطابقة غير حساسة لحالة الأحرف /ruby/i يتطابق مع "Ruby"، "RUBY"، "rUbY"
m وضع متعدد الأسطر (النقطة تطابق سطر جديد) /./m يتطابق مع أي حرف بما في ذلك السطر الجديد
x وضع موسع (يسمح بالتعليقات والمسافات البيضاء) /pattern # comment/x
o أداء #{} التداخلات مرة واحدة فقط /#{pattern}/o
u ترميز UTF-8 /\\\\u{1F600}/u يتطابق مع الإيموجي 😀

أمثلة:

/ruby/ =~ "RUBY"    # nil (لا يوجد تطابق)
/ruby/i =~ "RUBY"   # 0 (يتطابق في البداية)

# بدون معامل 'm'، النقطة لا تتطابق مع السطور الجديدة
/a.b/ =~ "a\\\\nb"     # nil
# مع معامل 'm'، النقطة تتطابق مع السطور الجديدة أيضًا
/a.b/m =~ "a\\\\nb"    # 0

تقنيات متقدمة للتعبيرات العادية في روبي

المجموعات غير المتقاطعة في التعبيرات العادية في روبي

في بعض الأحيان تحتاج إلى التجميع دون التقاط النص المدخل:

/(?:ab)+c/.match("ababc")  # يتطابق مع "ababc" دون التقاط "ab"

التطلع إلى الأمام والتطلع إلى الوراء في التعبيرات العادية في روبي

تسمح لك التأكيدات المتقدمة بمطابقة نمط فقط إذا تبعه نمط آخر:

# مطابقة "apple" فقط إذا تبعها "pie"
/apple(?= pie)/.match("apple pie")  # يتطابق مع "apple"
/apple(?= pie)/.match("apple tart") # لا يوجد تطابق

# مطابقة "apple" فقط إذا لم تتبعها "pie"
/apple(?! pie)/.match("apple tart") # يتطابق مع "apple"

تعمل التأكيدات المتطلعة بشكل مشابه ولكنها تتحقق مما يأتي قبلها:

# مطابقة "pie" فقط إذا تبعها "apple"
/(?<=apple )pie/.match("apple pie")  # يتطابق مع "pie"
/(?<=apple )pie/.match("فطيرة الكرز") # لا يوجد تطابق

نصائح الأداء للتعبيرات العادية في روبي

  1. كن محددًا: الأنماط الأكثر تحديدًا تؤدي بشكل أفضل من الأنماط العامة
  2. تجنب التراجع المفرط: يمكن أن تؤدي الأنماط المعقدة مع العديد من المحددات إلى مشاكل في الأداء
  3. استخدم الدعائم: عند الاقتضاء، استخدم \\\\A، \\\\z، ^ و $ لتحديد المكان الذي يمكن أن تحدث فيه المطابقات
  4. تجنب البدائل: أحيانًا تكون طرق السلسلة البسيطة مثل include? أو start_with? أسرع من التعبيرات العادية للحالات البسيطة

خاتمة حول التعبيرات العادية في روبي

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

الممارسة هي المفتاح لتصبح بارعًا في التعبيرات العادية. ابدأ بأنماط بسيطة وادمج ميزات أكثر تعقيدًا تدريجياً عندما تشعر بالراحة مع الأساسيات. العديد من الأدوات عبر الإنترنت مثل Rubular (https://rubular.com/) يمكن أن تساعدك في اختبار وتصحيح التعبيرات العادية الخاصة بك بشكل تفاعلي.

من خلال فهم المفاهيم التي تم تناولها في هذه الدورة التدريبية، ستكون مجهزًا جيدًا للتعامل مع مجموعة واسعة من تحديات معالجة النصوص في مشاريع روبي الخاصة بك.