JavaRush /مدونة جافا /Random-AR /RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية الجزء 4
Artur
مستوى
Tallinn

RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية الجزء 4

نشرت في المجموعة
RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية الجزء الأول RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية. الجزء الثاني : 20 خطوة قصيرة لإتقان التعبيرات العادية. الجزء 3 هذا الجزء الأخير، في المنتصف، سوف يتطرق إلى الأشياء التي يستخدمها بشكل أساسي أساتذة التعبير العادي. ولكن المواد من الأجزاء السابقة كانت سهلة بالنسبة لك، أليس كذلك؟ هذا يعني أنه يمكنك التعامل مع هذه المادة بنفس السهولة! الأصلي هنا RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية  الجزء 4 - 1 <h2>الخطوة 16: مجموعات بدون التقاط (?:)</h2> RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية  الجزء 4 - 2في المثالين في الخطوة السابقة، كنا نلتقط نصًا لم نكن بحاجة إليه حقًا. في مهمة أحجام الملفات، قمنا بالتقاط المسافات قبل الرقم الأول من أحجام الملفات، وفي مهمة CSV، قمنا بالتقاط الفواصل بين كل رمز مميز. لا نحتاج إلى التقاط هذه الأحرف، ولكننا نحتاج إلى استخدامها لبناء تعبيرنا العادي. هذه خيارات مثالية لاستخدام مجموعة دون التقاط ملفات (?:). تعمل المجموعة غير الالتقاطية تمامًا كما تبدو - فهي تسمح بتجميع الأحرف واستخدامها في التعبيرات العادية، ولكنها لا تلتقطها في مجموعة مرقمة:
النمط: (؟:")([^"]+)(?:") 
سلسلة: أريد فقط "النص الموجود داخل علامات الاقتباس هذه" .
التطابقات:             ^^^^^^^^^^^^^^^^^^^^^^^^ 
المجموعة:                 111111111111111111111111111    
( مثال ) يطابق التعبير العادي الآن النص المقتبس بالإضافة إلى أحرف الاقتباس نفسها، لكن مجموعة الالتقاط التقطت النص المقتبس فقط. لماذا ينبغي لنا أن نفعل ذلك؟ النقطة المهمة هي أن معظم محركات التعبير العادي تسمح لك باستعادة النص من مجموعات الالتقاط المحددة في تعبيراتك العادية. إذا تمكنا من حذف الأحرف الإضافية التي لا نحتاجها دون تضمينها في مجموعات الالتقاط الخاصة بنا، فسيسهل ذلك تحليل النص ومعالجته لاحقًا. إليك كيفية تنظيف محلل CSV من الخطوة السابقة:
النمط: (?:^|,)\s*(?:\"([^"،]*)\"|([^"، ]*)) 
السلسلة:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , ""، l 
التطابقات: ^ ^ ^^^ ^ ^ ^^^ ^^^^ ^ ^ 
المجموعة:    2 1 111 2 2 111 2222 2 2    
( مثال ) هناك بعض الأشياء <mark>التي يجب ملاحظتها هنا:</mark> أولاً، لم نعد نلتقط الفواصل منذ أن قمنا بتغيير مجموعة الالتقاط (^|,)إلى مجموعة غير ملتقطة (?:^|,). ثانيًا، قمنا بدمج مجموعة الالتقاط ضمن مجموعة غير الالتقاط. يكون هذا مفيدًا، على سبيل المثال، عندما تحتاج إلى ظهور مجموعة من الأحرف بترتيب معين، ولكنك تهتم فقط بمجموعة فرعية من تلك الأحرف. في حالتنا، كنا بحاجة إلى ظهور الأحرف التي لا تحتوي على علامات اقتباس والأحرف التي لا تحتوي على فواصل [^",]*بين علامات الاقتباس، لكننا لم نكن بحاجة بالفعل إلى أحرف الاقتباس نفسها، لذلك لم تكن هناك حاجة إلى التقاطها. أخيرًا، <mark>لاحظ</mark> أنه في المثال أعلاه يوجد أيضًا تطابق طوله صفر بين الأحرف kو l. علامات الاقتباس ""هي السلسلة الفرعية التي تم البحث عنها، ولكن لا توجد أحرف بين علامات الاقتباس، وبالتالي فإن السلسلة الفرعية المطابقة لا تحتوي على أحرف (طول صفر). <h3>هل يجب علينا تعزيز معرفتنا؟ فيما يلي مهمتان ونصف ستساعدنا في هذا:</h3> باستخدام المجموعات غير الالتقاطية (ومجموعات الالتقاط، وفئات الأحرف، وما إلى ذلك)، اكتب تعبيرًا عاديًا يلتقط فقط أحجام الملفات المنسقة بشكل صحيح على السطر أقل :
نمط:
السلسلة:   6.6 كيلو بايت 1..3 كيلو بايت 12 كيلو بايت 5 جيجا 3.3 ميجا بايت كيلو بايت .6.2 تيرابايت 9 ميجا بايت .
المباريات: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
المجموعة:    11111 1111 11111 111    
( الحل ) تبدأ علامات فتح HTML بـ <وتنتهي بـ >. تبدأ علامات إغلاق HTML بتسلسل من الأحرف </وتنتهي بالحرف >. اسم العلامة موجود بين هذه الأحرف. هل يمكنك كتابة تعبير عادي لالتقاط الأسماء الموجودة في العلامات التالية فقط؟ (قد تتمكن من حل هذه المشكلة دون استخدام مجموعات غير ملتقطة. حاول حل هذه المشكلة بطريقتين! مرة مع المجموعات ومرة ​​بدونها.)
نمط:
السلسلة:   <p> </span> <div> </kbd> <link> 
التطابقات: ^^^ ^^^^^^ ^^^^^ ^^^^^^ ^^^^^^ 
المجموعة:    1 1111 111 111 1111    
( الحل باستخدام مجموعات غير ملتقطة ) ( الحل بدون استخدام مجموعات غير ملتقطة ) <h2>الخطوة 17: الروابط الخلفية \Nومجموعات الالتقاط المسماة </h2> RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية  الجزء 4 - 3على الرغم من أنني حذرتك في المقدمة من أن محاولة إنشاء محلل HTML باستخدام التعبيرات العادية عادةً يؤدي إلى وجع القلب، وهذا المثال الأخير هو جزء لطيف من ميزة أخرى (أحيانًا) مفيدة لمعظم التعبيرات العادية: المراجع الخلفية. الروابط الخلفية تشبه المجموعات المتكررة حيث يمكنك محاولة التقاط نفس النص مرتين. ولكنها تختلف في جانب واحد مهم - فهي ستلتقط نفس النص حرفًا بحرف فقط. بينما ستسمح لنا المجموعة المتكررة بالتقاط شيء مثل هذا:
النمط: (he(?:[az])+) 
السلسلة:   heyabcdefg hey heyo heyellow heyyyyyyyyyy 
المباريات: ^^^^^^^^^^ ^^^ ^^^^ ^^^^^^^^ ^^^ ^^^^^^^^ 
المجموعة:    1111111111 111 1111 11111111 11111111111    
( مثال ) ... فإن الرابط الخلفي سيطابق هذا فقط:
النمط: (he([az])(\2+)) 
السلسلة: heyabcdefg hey heyo heyellow heyyyyyyyyy 
التطابقات:                              ^^^^^^^^^^^ 
المجموعة:                                 11233333333    
( مثال ) تكون مجموعات الالتقاط المتكررة مفيدة عندما تريد مطابقة نفس النمط بشكل متكرر، في حين تكون الروابط الخلفية جيدة عندما تريد مطابقة نفس النص. على سبيل المثال، يمكننا استخدام رابط خلفي لمحاولة العثور على علامات HTML للفتح والإغلاق المتطابقة:
النمط: <(\w+)[^>]*>[^<]+<\/\1> 
السلسلة:   <span style="color: red">hey</span> 
التطابقات: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
المجموعة:    1111    
( مثال ) <mark>يرجى ملاحظة</mark> أن هذا مثال مبسط للغاية وأوصي بشدة بعدم محاولة كتابة محلل HTML يعتمد على التعبير العادي. هذا بناء جملة معقد للغاية ومن المرجح أن يجعلك مريضًا. مجموعات الالتقاط المُسمّاة تشبه إلى حد كبير الروابط الخلفية، لذا سأقوم بتغطيتها بإيجاز هنا. الفرق الوحيد بين المراجع الخلفية ومجموعة الالتقاط المسماة هو أن... مجموعة الالتقاط المسماة لها اسم:
النمط: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
السلسلة:   <span style="color: red">hey< /span> 
التطابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
المجموعة:    1111    
( مثال ) يمكنك إنشاء مجموعة التقاط مسماة باستخدام بناء الجملة (؟<name>...) أو (?'name'...) (تعبير عادي متوافق مع .NET) أو باستخدام بناء الجملة هذا (?P<name>. ..) أو (؟P'name'...) (تعبير عادي متوافق مع Python). نظرًا لأننا نستخدم PCRE (التعبير العادي المتوافق مع Perl) الذي يدعم كلا الإصدارين، فيمكننا استخدام أي منهما هنا. (نسخ Java 7 بناء جملة .NET، ولكن نسخة الأقواس الزاوية فقط. ملاحظة المترجم) لتكرار مجموعة التقاط مسماة لاحقًا في تعبير عادي، نستخدم \<kname> أو \k'name' (.NET) أو (؟ P= الاسم) (بايثون). مرة أخرى، يدعم PCRE كل هذه الخيارات المختلفة. يمكنك قراءة المزيد عن مجموعات الالتقاط المسماة هنا ، ولكن هذا كان معظم ما تحتاج إلى معرفته حقًا عنها. <h3>مهمة لمساعدتنا:</h3> استخدم الروابط الخلفية لمساعدتي في تذكر... أممم... اسم هذا الشخص.
نمط:
السلسلة: "مرحبًا، اسمي جو." [لاحقًا] "ما اسم هذا الرجل؟ جو ؟"
التطابقات:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
المجموعة:                  111    
( الحل ) <h2>الخطوة 18: النظر إلى الأمام والنظر إلى الخلف</h2> RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية  الجزء 4 - 4الآن سوف نتعمق في بعض الميزات المتقدمة للتعبيرات العادية. أستخدم كل شيء حتى الخطوة 16 كثيرًا. لكن هذه الخطوات القليلة الأخيرة مخصصة فقط للأشخاص الذين يستخدمون التعبير العادي على محمل الجد لمطابقة التعبيرات المعقدة للغاية. وبعبارة أخرى، سادة التعبيرات العادية. قد يبدو "التطلع إلى الأمام" و"النظر إلى الخلف" معقدين للغاية، لكنهما في الواقع ليسا معقدين للغاية. إنها تتيح لك القيام بشيء مشابه لما فعلناه مع المجموعات غير الملتقطة مسبقًا - تحقق مما إذا كان هناك أي نص مباشرة قبل أو بعد النص الفعلي الذي نريد مطابقته مباشرة. على سبيل المثال، لنفترض أننا نريد مطابقة أسماء الأشياء التي يحبها الأشخاص فقط، ولكن فقط إذا كانوا متحمسين لها (فقط إذا أنهوا جملتهم بعلامة تعجب). يمكننا أن نفعل شيئا مثل:
النمط: (\w+)(?=!) 
السلسلة: أحب المكتب. وأنا أقدر دباسة. أنا أحب المصباح !
المباريات:                                           ^^^^ 
المجموعة:                                              1111    
( مثال ) يمكنك أن ترى كيف أن مجموعة الالتقاط أعلاه (\w+)، والتي عادة ما تتطابق مع أي من الكلمات الموجودة في المقطع، تتطابق فقط مع كلمة مصباح. التطلع الإيجابي (?=!)يعني أنه يمكننا فقط مطابقة التسلسلات التي تنتهي بـ !ولكننا لا نطابق في الواقع حرف علامة التعجب نفسه. يعد هذا تمييزًا مهمًا لأنه مع المجموعات غير الملتقطة، فإننا نطابق الشخصية ولكن لا نلتقطها. باستخدام التطلعات الأمامية والنظرية الخلفية، نستخدم حرفًا لبناء تعبيرنا العادي، لكننا لا نطابقه حتى مع نفسه. يمكننا مطابقته لاحقًا في تعبيرنا العادي. هناك أربعة أنواع من النظرة الأمامية والنظرة الخلفية: نظرة أمامية إيجابية (؟=...)، نظرة أمامية سلبية (؟!...)، نظرة أمامية إيجابية (؟<=...) ونظرة أمامية سلبية (؟<!. ..) . إنها تفعل ما تبدو عليه - يسمح المظهر الأمامي والنظر الخلفي الإيجابي لمحرك التعبير العادي بمواصلة المطابقة فقط عندما يتطابق النص الموجود في المظهر الأمامي/النظر الخلفي فعليًا. إن المظهر الأمامي السلبي والنظر الخلفي يفعلان العكس - فهم يسمحان للتعبير العادي بالمطابقة فقط عندما لا يتطابق النص الموجود في المظهر الأمامي/النظر الخلفي. على سبيل المثال، نريد مطابقة أسماء الطرق فقط في سلسلة من تسلسلات الأساليب، وليس الكائن الذي تعمل عليه. في هذه الحالة، يجب أن يسبق كل اسم أسلوب بـ .. يمكن أن يساعد التعبير العادي باستخدام نظرة سريعة بسيطة هنا:
النمط: (؟<=\.)(\w+) 
السلسلة: myArray. flatMap.aggregate.summrise.print !
التطابقات:         ^^^^^^^ ^^^^^^^^^^^^^^^^^ 
المجموعة:            1111111 111111111 111111111 11111    
( مثال ) في النص أعلاه، نقوم بمطابقة أي تسلسل لأحرف الكلمة \w+، ولكن فقط إذا كانت مسبوقة بالحرف .. يمكننا تحقيق شيء مماثل باستخدام مجموعات غير ملتقطة، لكن النتيجة ستكون أكثر فوضوية بعض الشيء:
النمط: (؟:\.)(\w+) 
السلسلة: myArray .flatMap.aggregate.summarise.print !
التطابقات:        ^^^^^^^^ ^^^^^^^^^^^^^^^^^ 
المجموعة:            1111111 111111111 111111111 11111    
( مثال ) على الرغم من أنه أقصر، إلا أنه يتطابق مع أحرف لا نحتاجها. على الرغم من أن هذا المثال قد يبدو تافهًا، إلا أن النظرة الأمامية والنظرة الخلفية يمكن أن تساعدنا حقًا في تنظيف تعبيراتنا العادية. <h3>لم يتبق سوى عدد قليل جدًا حتى النهاية! ستقربنا المهمتان التاليتان خطوة واحدة منه:</h3> يسمح البحث الخلفي السلبي (?<!...) لمحرك التعبير العادي بمواصلة محاولة العثور على تطابق فقط إذا لم يكن النص الموجود داخل الشكل الخلفي السلبي موجودًا يتم عرضه حتى بقية النص الذي تحتاج إلى العثور على تطابق معه. على سبيل المثال، يمكننا استخدام تعبير عادي لمطابقة الأسماء الأخيرة للنساء اللاتي يحضرن مؤتمرًا فقط. وللقيام بذلك، نود التأكد من أن الاسم الأخير للشخص لا يسبقه حرف Mr.. هل يمكنك كتابة تعبير عادي لهذا؟ (يمكن افتراض أن الأسماء الأخيرة تتكون من أربعة أحرف على الأقل.)
نمط:
سلسلة: السيد. براون، السيدة. سميث ، السيدة. جونز ، الآنسة ديزي ، السيد. أخضر
التطابقات:                ^^^^^ ^^^^^ ^^^^^ 
المجموعة:                   11111 11111 11111    
( الحل ) لنفترض أننا نقوم بمسح قاعدة بيانات ولدينا عمود من المعلومات يمثل النسب المئوية. لسوء الحظ، بعض الأشخاص كتبوا أرقامًا كقيم عشرية في النطاق [0.0، 1.0]، بينما كتب آخرون نسبًا في النطاق [0.0%، 100.0%]، وما زال آخرون يكتبون قيمًا مئوية، لكنهم نسوا علامة النسبة المئوية الحرفية %. باستخدام النظرة الأمامية السلبية (؟!...)، هل يمكنك وضع علامة فقط على تلك القيم التي يجب أن تكون نسبًا مئوية ولكنها تفتقد أرقامًا %؟ يجب أن تكون هذه القيم أكبر من 1.00 تمامًا، ولكن بدون إضافة %. (لا يمكن أن يحتوي أي رقم على أكثر من رقمين قبل العلامة العشرية أو بعدها.) <mark>لاحظ</mark> أن هذا الحل صعب للغاية . إذا تمكنت من حل هذه المشكلة دون النظر إلى إجابتي، فهذا يعني أن لديك بالفعل مهارات هائلة في التعبيرات العادية!
نمط:
السلسلة: 0.32 100.00 5.6 0.27 98% 12.2% 1.01 0.99% 0.99 13.13 1.10 
التطابقات:      ^^^^^^ ^^^ ^^^^^^^^^ ^^^^ 
المجموعة:         111111 111 1111 11111 1111    
( الحل ) <h2>الخطوة 19: الشروط في التعبيرات العادية</h2> لقد RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية  الجزء 4 - 5وصلنا الآن إلى النقطة التي لن يستخدم فيها معظم الأشخاص التعبيرات العادية بعد الآن. لقد قمنا على الأرجح بتغطية 95% من حالات الاستخدام للتعبيرات العادية البسيطة، وكل ما يتم فعله في الخطوتين 19 و20 يتم عادةً بواسطة لغة معالجة نصية أكثر اكتمالًا مثل awk أو sed (أو لغة برمجة للأغراض العامة). ومع ذلك، دعنا نمضي قدمًا، حتى تعرف ما يمكن أن يفعله التعبير العادي حقًا. على الرغم من أن التعبيرات العادية ليست مكتملة حسب تورينج ، إلا أن بعض محركات التعبير العادي تقدم ميزات مشابهة جدًا للغة برمجة كاملة. إحدى هذه الميزات هي "الحالة". تسمح شروط Regex الشرطية بعبارات if-then-else، حيث يتم تحديد الفرع المختار إما من خلال "التطلع إلى الأمام" أو "النظر إلى الوراء" الذي تعلمناه في الخطوة السابقة. على سبيل المثال، قد ترغب في مطابقة الإدخالات الصالحة فقط في قائمة التواريخ:
النمط: (?<=Feb )([1-2][0-9])|(?<=Mar )([1-2][0-9]|3[0-1]) 
السلسلة: تواريخ العمل : 28 فبراير ، 29 فبراير ، 30 فبراير، 30 مارس ، 31 مارس  
المباريات:                   ^^ ^^ ^^ ^^ 
المجموعة:                      11 11 22 22    
( مثال ) <mark>لاحظ</mark> أن المجموعات المذكورة أعلاه تتم فهرستها أيضًا حسب الشهر. يمكننا كتابة تعبير عادي لجميع الأشهر الـ 12 والتقاط التواريخ الصالحة فقط، والتي سيتم بعد ذلك دمجها في مجموعات مفهرسة حسب شهر السنة. يستخدم ما سبق نوعًا من البنية المشابهة التي ستبحث فقط عن التطابقات في المجموعة الأولى إذا كان "فبراير" يسبق رقمًا (وبالمثل بالنسبة للمجموعة الثانية). ولكن ماذا لو أردنا فقط استخدام المعالجة الخاصة لشهر فبراير؟ شيء من هذا القبيل "إذا كان الرقم مسبوقًا بـ "فبراير"، فافعل هذا، وإلا فافعل هذا الشيء الآخر." وإليك كيفية القيام بذلك الشرطية:
النمط: (?(?<=Feb )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
السلسلة: تواريخ العمل: 28 فبراير ، 29 فبراير ، 30 فبراير، 30 مارس ، 31 مارس  
المباريات:                   ^^ ^^ ^^ ^^ 
المجموعة:                      11 11 22 22    
( مثال ) تبدو بنية if-then-else مثل (?(If)then|else)، حيث يتم استبدال (if) بـ "look Forward" أو "look back". في المثال أعلاه، (إذا) مكتوبة كـ (?<=Feb). يمكنك أن ترى أننا قمنا بمطابقة التواريخ الأكبر من 29، ولكن فقط إذا كانت لا تتبع "فبراير". يعد استخدام lookbehinds في التعبيرات الشرطية مفيدًا إذا كنت تريد التأكد من أن المطابقة مسبوقة ببعض النصوص. يمكن أن تكون الشروط الشرطية الموجبة مربكة لأن الشرط نفسه لا يطابق أي نص. لذا، إذا كنت تريد أن يكون لشرط if قيمة، فيجب أن تكون قابلة للمقارنة مع lookahead كما هو موضح أدناه:
النمط: (?(?=بالضبط)تام|آخر)wo 
سلسلة: تمامًا آخر بالضبطمطابقتين آخرتين  
:            ^^^^^^^ ^^^^^^
( مثال ) هذا يعني أن الشروط الشرطية الإيجابية عديمة الفائدة. يمكنك التحقق لمعرفة ما إذا كان هذا النص في المقدمة ثم تقديم نمط مطابق لاتباعه عندما يكون موجودًا. التعبير الشرطي لا يساعدنا هنا على الإطلاق. يمكنك أيضًا استبدال ما ورد أعلاه بتعبير عادي أبسط:
النمط: (؟: بالضبط | آخر) 
سلسلة واحدة: بالضبط آخر متطابقان آخران  
:            ^^^^^^^ ^^^^^^
( مثال ) إذن، القاعدة الأساسية للتعبيرات الشرطية هي: اختبار، واختبار، واختبار مرة أخرى. وإلا فإن الحلول التي تعتقد أنها واضحة ستفشل بأكثر الطرق إثارة وغير متوقعة :) <h3>هنا نصل إلى المجموعة الأخيرة من المهام التي تفصلنا عن الخطوة العشرين النهائية:</h3> اكتب تعبيرًا عاديًا يستخدم التعبير الشرطي السلبي لاختبار ما إذا كانت الكلمة التالية تبدأ بحرف كبير. إذا كان الأمر كذلك، فاستخدم حرفًا كبيرًا واحدًا فقط ثم الأحرف الصغيرة. إذا لم يحدث ذلك، فاحصل على أي أحرف كلمة.
نمط:
السلسلة:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
المطابقات: ^^^^^ ^^^^^ ^^^^^ ^^^^^^ ^^^^^^^^^^^ ^^^ 
المجموعة:    22222 22222 11111 222222 111111111 222 111    
( الحل ) اكتب تعبيرًا شرطيًا سلبيًا ينظر خلفًا يلتقط النص ownsفقط إذا لم يكن مسبوقًا بنص cl، ويلتقط النص oudsفقط عندما يسبقه نص cl. (قليلا مثال مفتعل، ولكن ماذا يمكنك أن تفعل ...)
نمط:
السلسلة: يمتلك هؤلاء المهرجون بعض العود . عود.
التطابقات:              ^^^^ ^^^^   
( الحل ) <h2>الخطوة 20: التكرار والدراسة الإضافية</h2> RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية  الجزء 4 - 6في الواقع، هناك الكثير مما يمكن اختصاره في مقدمة مكونة من 20 خطوة لأي موضوع، والتعبيرات العادية ليست استثناءً. هناك العديد من التطبيقات والمعايير المختلفة للتعبيرات العادية التي يمكن العثور عليها على الإنترنت. إذا كنت تريد معرفة المزيد، أقترح عليك مراجعة الموقع الرائع Regularexpressions.info ، فهو مرجع رائع وبالتأكيد تعلمت الكثير عن التعبيرات العادية من هناك. أوصي به بشدة، وكذلك regex101.com لاختبار إبداعاتك ونشرها. في هذه الخطوة الأخيرة، سأعطيك المزيد من المعرفة حول التعبيرات العادية، أي كيفية كتابة التعبيرات العودية. التكرارات البسيطة بسيطة جدًا، لكن دعونا نفكر فيما يعنيه ذلك في سياق التعبير العادي. تتم كتابة بناء جملة العودية البسيطة في التعبير العادي على النحو التالي: (?R)?. لكن، بالطبع، يجب أن يظهر بناء الجملة هذا ضمن التعبير نفسه. ما سنفعله هو دمج التعبير داخل نفسه، لعدد عشوائي من المرات. على سبيل المثال:
النمط: (hey(?R)?oh) 
السلسلة:   heyoh heyyoh heyheyohoh hey oh heyhey hey heyheyohoh  
التطابقات: ^^^^^ ^^^^^^^^^^ ^^^^^^^^^^ 
المجموعة:    11111 1111111111 1111111111    
( مثال ) بما أن التعبير المتداخل اختياري ( (?R)متبوع ?)، فإن أبسط مطابقة هي ببساطة تجاهل العودية تمامًا. لذا، heyثم ohيطابق ( heyoh). لمطابقة أي تعبير أكثر تعقيدًا من هذا، يجب أن نجد تلك السلسلة الفرعية المطابقة متداخلة داخل نفسها عند النقطة في التعبير حيث قمنا بإدراج (?R)التسلسل. بمعنى آخر، يمكننا العثور على هيهيهوه أو هيهيهيهوهوه، وهكذا. أحد الأشياء الرائعة في هذه التعبيرات المتداخلة هو أنها، على عكس المراجع الخلفية ومجموعات الالتقاط المسماة، لا تقيدك بالنص الدقيق الذي قمت بمطابقته مسبقًا، حرفًا بحرف. على سبيل المثال:
النمط: ([Hh][Ee][Yy](?R)?oh) 
السلسلة:   heyoh heyyoh hEyHeYohoh hey oh heyhey hEyHeYHEyohohoh  
التطابقات: ^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^ 
المجموعة:    11111 1111111111 111111111111111    
( مثال ) يمكنك أن تتخيل أن محرك التعبير العادي يقوم حرفيًا بنسخ ولصق تعبيرك العادي في نفسه عددًا عشوائيًا من المرات. وبطبيعة الحال، هذا يعني أنه في بعض الأحيان قد لا تفعل ما كنت تأمل:
النمط: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
سلسلة: (* تعليق (* متداخل *) وليس *)
المباريات:            ^^^^^^^^^^^^ 
المجموعة:               111111111111    
( مثال ) هل يمكنك معرفة سبب التقاط هذا التعبير العادي للتعليق المتداخل فقط وليس التعليق الخارجي؟ هناك شيء واحد مؤكد: عند كتابة تعبيرات عادية معقدة، اختبرها دائمًا للتأكد من أنها تعمل بالطريقة التي تعتقد أنها ستعمل بها. لقد انتهى هذا التجمع عالي السرعة على طول طرق التعبيرات العادية. أتمنى أن تستمتع بهذه الرحلة. حسنًا، أخيرًا، سأترك هنا، كما وعدت في البداية، عدة روابط مفيدة لدراسة أكثر تعمقًا للمادة:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION