كيفية تقسيم السلاسل في روبي

ما لم يكن إدخال المستخدم كلمة أو رقمًا واحدًا ، يجب أن يكون هذا الإدخال انشق، مزق أو تحولت إلى قائمة سلاسل أو أرقام.

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

كيف تعمل سلسلة # الانقسام

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

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

#! / usr / bin / env ruby
طباعة "ما هو اسمك الكامل؟ "
full_name = gets.chomp
name = full_name.split ('')
يضع "اسمك الأول هو # {name.first}"
يضع "اسمك الأخير هو # {name.last}"

إذا قمنا بتشغيل هذا البرنامج وأدخلنا اسمًا ، فسوف نحصل على بعض النتائج المتوقعة. لاحظ أيضًا الاسم الاول و الاسم الاخير هي مصادفة. ال اسم المتغير سيكون مجموعة مصفوفة، وستكون هاتان المكالمتان الطريقة مساوية لـ الاسم [0] و الاسم [-1] على التوالي.

instagram viewer
انقسام $ ruby. rb
ما هو اسمك الكامل؟ مايكل سي. مورين
اسمك الأول هو مايكل
اسمك الأخير هو Morin

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

لذا ، إذا أردنا أن نعطيه بعض المدخلات المشوهة قليلاً مثل

مايكل سي. مورين

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

يمكنك أيضًا تمرير تعبير عادي باعتباره الوسيطة الأولى. هنا، تم تقسيم السلسلة # يصبح أكثر مرونة. يمكننا أيضًا أن نجعل رمز تقسيم اسمنا الصغير أكثر ذكاءً قليلاً.

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

لذا ، يمكننا تطوير مثالنا قليلاً:

تقسيم $ القط. rb
#! / usr / bin / env ruby
طباعة "ما هو اسمك الكامل؟ "
full_name = gets.chomp
name = full_name.split (/ \.؟ \ s + /)
يضع "اسمك الأول هو # {name.first}"
يضع "الحرف الأول الأوسط هو # {name [1]}"
يضع "اسمك الأخير هو # {name.last}"

فاصل التسجيل الافتراضي

روبي ليست كبيرة حقًا في "المتغيرات الخاصة" التي قد تجدها في لغات مثل Perl ، ولكن تم تقسيم السلسلة # لا تستخدم واحدة يجب أن تكون على دراية بها. هذا هو متغير فاصل السجل الافتراضي ، والمعروف أيضًا باسم $;.

إنه عالمي ، وهو شيء لا تشاهده غالبًا في Ruby ، ​​لذلك إذا قمت بتغييره ، فقد يؤثر على أجزاء أخرى من التعليمات البرمجية - فقط تأكد من تغييره مرة أخرى عند الانتهاء.

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

المحددات ذات الطول الصفري

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

يمكن أن يكون هذا مفيدًا للتكرار عبر السلسلة وقد تم استخدامه في الإصدار السابق 1.9.x و 1.8.7 المسبق (الذي تم دعمه مسبقًا عدد الميزات من 1.9.x) للتكرار على الأحرف في سلسلة دون القلق بشأن الانفصال متعدد البايت أحرف Unicode. ومع ذلك ، إذا كان ما تريد فعله فعلاً هو التكرار عبر سلسلة ، وكنت تستخدم 1.8.7 أو 1.9.x ، فمن المحتمل أن تستخدم السلسلة # each_char في حين أن.

#! / usr / bin / env ruby
str = "لقد حولتني إلى newt!"
str.split (''). كل منها يقوم | c |
يضع ج
النهاية

تحديد طول المصفوفة المرتجعة

إذا عدنا إلى مثال تحليل اسمنا ، ماذا لو كان لدى شخص مسافة في اسمه الأخير؟ على سبيل المثال ، غالبًا ما تبدأ الألقاب الهولندية بـ "van" (بمعنى "من" أو "من").

نحن نريد حقًا عنصر 3 مجموعة مصفوفة، حتى نتمكن من استخدام الحجة الثانية ل تم تقسيم السلسلة # التي تجاهلناها حتى الآن. من المتوقع أن تكون الحجة الثانية أ Fixnum. إذا كانت هذه الحجة إيجابية ، على الأكثر ، سيتم ملء العديد من العناصر في المصفوفة. لذلك في حالتنا ، نريد تمرير 3 لهذه الحجة.

#! / usr / bin / env ruby
طباعة "ما هو اسمك الكامل؟ "
full_name = gets.chomp
name = full_name.split (/ \.؟ \ s + /، 3)
يضع "اسمك الأول هو # {name.first}"
يضع "الحرف الأول الأوسط هو # {name [1]}"
يضع "اسمك الأخير هو # {name.last}"

إذا قمنا بتشغيل هذا مرة أخرى وقمنا بإعطائه اسمًا هولنديًا ، فسيعمل كما هو متوقع.

انقسام $ ruby. rb
ما هو اسمك الكامل؟ فنسنت ويليم فان جوخ
اسمك الأول هو فنسنت
الحرف الأول الأوسط هو Willem
اسمك الأخير هو فان جوخ

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

هذا موضح في مقتطف IRB هذا:

: 001> "this، is، a، test" .split ('،'، -1)
=> ["this"، "is"، "a"، "test"، ""، ""، ""، ""]