نجتاز التحدي من Callum Macrae 100٪

أقترح محاولة حل 10 اختبارات ريكس من Callum Macrae. على عكس تحليلي السابق للتحدي ، لا توجد مهام بسيطة وبسيطة بصراحة. كما يقولون - فقط ريكس ، المتشددين فقط.


نظرًا لأن التحدي معقد للغاية ، فليس من الضروري اتباع جميع القواعد مثلي ، أي اجتياز الاختبار هو 100 ٪ - يعني أنك محترف للغاية. أهلا وسهلا بك!


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


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


المهمة 1 - تسليط الضوء على الكلمات المكررة


http://callumacrae.imtqy.com/regex-tuesday/challenge1.html


هناك مجموعة من الجمل ، في هذه الجملة قد تكون هناك كلمات مكررة. من الضروري تسليط الضوء على تكرار الكلمات.


مثال:


This is is a test 

في هذه الحالة ، يتم تكرار كلمة "هو" مرتين ، مظللة بالخط العريض:


 This is <strong>is</strong> a test 

مساعدة

من الضروري العثور على تكرارات للكلمات ، وتكون الكلمات مفصولة بمسافة ، لذلك - مطلوب حرف مسافة بيضاء. في التعبيرات العادية ، من الممكن تقنيًا العثور على التكرار فقط من خلال الرابط الخلفي.


قرار

التعبير:


 /\b([\w']+)\s(\1)\b/gi 

بديل:


 $1 <strong>$2</strong> 

حل تحليل
  • "\ b" - يجب أن تبدأ من حدود الكلمة
  • "([\ w '] +)" - أي عدد من الحروف والأرقام وعلامة الفاصلة العليا (يمكنك أيضًا حلها مع أي مساحة أخرى ) وتأكد من التقاطها في مجموعة ، لأن التالي تحتاج إلى العثور على التكرار لهذه المجموعة.
  • "\ s (\ 1)" - لأننا نعلم أن التكرار يأتي بعد المسافة ، نضع مسافة "\ s" ثم نكتب ذلك بعد ذلك يجب أن يتبع تكرار المجموعة الأولى التي تم التقاطها مسبقًا "(\ 1)".
  • "\ b" - يجب أن ينتهي التكرار بكلمة حدود ، وإلا فإننا نجازف بالتقاط جزء فقط من الكلمة.

المهمة 2 - تدرج الرمادي


http://callumacrae.imtqy.com/regex-tuesday/challenge2.html


هناك رموز ملونة بتنسيقات مختلفة ، تتمثل المهمة في العثور على جميع درجات اللون الرمادي.


أمثلة من الرموز الصحيحة:


 #eEe #6F6F6F rgb(2.5, 2.5,2.5) hsl(0, 10%, 100%) 

أمثلة على الرموز غير الصحيحة:


 #eEf #11111e rgb(1.5%, 1.5%, 1.6%) hsl(20, 20%, 20%) 

شرح الكود

السؤال الأكثر أهمية في هذه المهمة هو ما يعتبر رمادي.


حسب ويكيبيديا ، الرمادي هو:


العديد من الألوان التي تم الحصول عليها من خلال الجمع بين الألوان الأساسية الثلاثة لنموذج ألوان RGB - الأحمر والأخضر والأزرق بتركيزات متساوية .

الرموز التي تبدأ بـ # هي التنسيق السداسي ، وهي تأتي في شكلين. مختصر ، ثلاثة أحرف (#rgb) وكاملة ، ستة أحرف $ rrggbb. حيث r ، g ، b هي الألوان الأساسية الثلاثة.
رموز rgb (r ، g ، b) هي نفسها تمامًا ، فهي مكتوبة فقط بالأرقام من 0 إلى 255.
تنسيق hsl أكثر تعقيدًا قليلاً ، والأرقام هنا تعني اللون والتشبع والخفة. لفهم الظروف التي يتم الحصول عليها بثلاثة ألوان أساسية بنسب متساوية ، على سبيل المثال ، يمكنك التنقل باستخدام هذا المحرر المرئي.


مساعدة

بالنسبة لسداسي عشرية مختصرة ، سيكون التكرار الصحيح هو تكرار الأحرف الثلاثة ، على سبيل المثال #aaa. لسداسي عشرية كاملة ، كرر حرفين ، على سبيل المثال #efefef. بالنسبة إلى rgb الرقمية ، كرر الأرقام ، على سبيل المثال rgb (2 ، 2 ، 2). إن فهم تنسيق hsl أكثر تعقيدًا بعض الشيء ، ولكن لا يزال معرفة ما سبق ، يمكنك أن تفهم أن اللون الرمادي هنا هو اللون الذي تكون فيه النغمة 0 أو التشبع هو 0 أو 100.


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


قرار
 /^(?:#(\w)\1\1|#(\w{2})\2\2|rgb\(((?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])%?(?:\.\d+)?),[ ]?[0]*\3,[ ]?[0]*\3\)|rgba\(([\d.]+%?),[0 ]*\4,[0 ]*\4,[^)]+\)|hsla?\([\d.]+,[ ]*(0%[^)]+|[\d.]+%,[ ]*(0|100)%[^\)]*)\))$/i 

حل تحليل

يتم كتابة سجادة منفصلة لكل لون ، وسوف نقوم بتحليلها بشكل منفصل:


 #(\w)\1\1 

  • "(\ w)" تأخذ حرفًا واحدًا في المجموعة.
  • "\ 1 \ 1" - وتشير إلى أنه يجب أن يتكرر مرتين.

لشخصين نفس الشيء - لن أكرر.


 rgb\(((?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])%?(?:\.\d+)?),[ ]?[0]*\3,[ ]?[0]*\3\) 

أرغب في كتابة "rgba؟" ، لكن الحالة ممكنة عندما يتم تحديد المعلمة الرابعة في rgb () ، لذلك يجب وصف rgb و rgba بشكل منفصل:


  • "\ d {1،2} | 1 \ d {2} | 2 [0-4] \ d | 25 [0-5]" - النطاق من 0 إلى 255. لن أقوم بتحليله بالتفصيل ، يمكنك الاطلاع على المهمة 5 هنا .
  • "(؟: \. \ d +)؟" - مجموعة اختيارية لم يتم تخصيص رقمها. نقطة ورقم بعد نقطة ممكنة (وهذا للأرقام غير عدد صحيح).
  • "، []؟ [0] * \ 3" - فاصلة إلزامية ، متبوعة بمساحة 0 أو 1 ، 0 أو العديد من الأصفار ، وبعد ذلك يجب تكرار قيمة المجموعة التي تم التقاطها مسبقًا.

في rgba () - نفس الشيء ، ولكن هناك حاجة إلى 4 معلمات.


 hsla?\([\d.]+,[ ]*(0%[^)]+|[\d.]+%,[ ]*(0|100)%[^\)]*)\) 

هنا ، بطريقة جيدة ، تحتاج أيضًا إلى الفصل بين hsl و hsla ، لكن لا توجد حالة من هذا القبيل في حالات الاختبار ، لذلك سنكتب "hsla" قليلاً.


  • "[\ d.] + ، [] *" - يأتي أولاً الرقم المطلوب "[\ d.] +" (بما في ذلك رقم غير كامل) مع فاصلة إلزامية ومسافة اختيارية "[] *".
  • "(0٪ [^)] + | [\ d.] +٪ ، [] * (0 | 100)٪ [^)] *" - ومن ثم خياران ممكنان: 1) حيث تأتي 0٪ أولاً ثم أي حرف غير الحرف الختامي للقوس [^)] + ؛ 2) يوجد أي رقم مع علامة النسبة المئوية الإلزامية وفاصلة "[\ d.] +٪ ،" ثم إما 0٪ أو 100٪ "(0 | 100)٪".

المهمة 3 - العثور على التواريخ


http://callumacrae.imtqy.com/regex-tuesday/challenge3.html


هناك قائمة من التواريخ ، من هذه التواريخ تجد التواريخ من 1000 إلى 2012 مكتوبة بشكل شامل بالتنسيق YYYY / MM / DD HH: MM (: SS). حيث يكون كل حرف رقمًا مطلوبًا ، ولا يكون بين قوسين شرط مسبق.


مثال


 2001/09/30 23:59:11 

مساعدة

"[0-9]" ليس مجموعة من الأرقام ، إنه تعبير يعني أن حرفًا واحدًا من 0-9 صالح. في التعبيرات العادية ، لا يوجد مجال للأعداد الكبيرة ، ولكن من هذه القطع الصغيرة يمكنك عمل تعبير منتظم يغطي النطاق المطلوب. مثال: "1 [0-9]" - نطاق من 10 إلى 19.


قرار
 /^(1[\d]{3}|200\d|201[0-2])\/(0[1-9]|1[0-2])\/(0[1-9]|1[0-9]|2[0-9]|3[0-2])\s(0[0-9]|1[0-9]|2[0-3]):([0-5][\d])(:([0-5][\d]))?$/ 

حل تحليل
  • السنة الصالحة هي "(1 [\ d] {3} | 200 \ d | 201 [0-2])" ، بالترتيب من 1000 إلى 1999 ، من 2000 إلى 2009 ، من 2010 إلى 2012.
  • الشهر "(0 [1-9] | 1 [0-2])". من 01 إلى 09 ومن 10 إلى 12.
  • اليوم "(0 [1-9] | 1 [0-9] | 2 [0-9] | 3 [0-2])". من 01 إلى 09 ومن 10 إلى 19 ومن 20 إلى 29 ومن 30 إلى 32.
  • ساعة "(0 [0-9] | 1 [0-9] | 2 [0-3])". من 00 إلى 09 ومن 10 إلى 19 ومن 20 إلى 23.
  • دقيقة "([0-5] [\ d])". 00 إلى 59
  • (: ([0-5] [\ d]))؟ - ثواني اختيارية ، من 00 إلى 59.

المهمة 4 - المائل


http://callumacrae.imtqy.com/regex-tuesday/challenge4.html


هناك نص مع MarkDown العلامات (مثلما هو الحال في Habré). يجب عليك كتابة تعبير عادي يستبدل الكلمات بين العلامات النجمية بعلامة <em>.


مثال


 *This text is italic.* -> <em>This text is italic.</em> 

مساعدة

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


قرار

التعبير:


 /(^|[^*])\*([^*].*?[^*]|[^*])\*((?!\*)|$)/g 

بديل:


 $1<em>$2</em> 

حل تحليل
  • "(^ | [^ *])" - سنبدأ إما من بداية السطر ، أو من أي حرف باستثناء العلامة النجمية. تحتاج المجموعة إلى التقاط هذا الرمز ووضعه أمام العلامة <em>.
  • ((؟! *) | $) - سننتهي إما بنهاية السطر ، أو بأي حرف ما عدا العلامة النجمية ، نظرًا لأن النظرة هنا - لا يتم التقاط المساحة.
  • "([^ *]. *؟ [^ *] | [^ *])" - في الوسط لدينا "[^ *]. *؟ [^ *]" أي نص لا يجب أن يبدأ وينتهي بعلامة نجمية وتعبير أو "| [^ *]" فقط لمراعاة شخصية واحدة داخل العلامة (ليس من الضروري اجتياز الاختبار).

المهمة 5 - تنسيق الأرقام


http://callumacrae.imtqy.com/regex-tuesday/challenge5.html


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


أمثلة على الأرقام المسجلة بشكل صحيح:


 1,024 8,205,500.4672 10.444444444444 30 000,7302 

مساعدة

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


قرار

التعبير:


 /^\d{1,3}([ ,]\d{3})*([.,]\d+)?$/ 

حل تحليل
  • "^ \ d {1،3}" - في بداية 1 إلى 3 أرقام.
  • "([[]] \ d {3}) *" - علاوة على فاصل ومجموعة من 3 أرقام ، تشير العلامة النجمية إلى أن تنسيقنا يمكن أن يحدث 0 أو عدة مرات.
  • "([.،] \ d +)؟ $" - في النهاية مجموعة ذات فاصل ورقم ، علامة الاستفهام عبارة عن أداة قياس كمية تشير إلى أن وجود الجزء غير الصحيح ليس شرطًا أساسيًا.

المهمة 6 - عناوين بروتوكول الإنترنت


http://callumacrae.imtqy.com/regex-tuesday/challenge6.html


من قائمة عناوين IP بتنسيقات متنوعة ، ابحث عن عناوين IP صالحة. ربما المهمة الأكثر كئيبة للجميع. ليس كثيرا فائقة التعقيد ، وكم الكئيب.


أمثلة لإدخالات عنوان IP الصحيحة والشرح:


  • 192.0.2.235 - عشري بفترات.
  • 0300.0000.0002.0353 - ثماني بالنقاط.
  • 0xC0.0x00.0x02.0xEB - ست عشري مع نقاط.
  • 0xC00002EC - ست عشري.
  • 287454020 - عشري.
  • 030000001353 - ثماني.

خلط الأشكال المختلفة أمر سيء. خصوصا الأرقام. ومما يزيد الموقف تعقيدًا حقيقة أن تنسيقات عناوين IP مع النقاط يمكن خلطها ، على سبيل المثال - 0xFF.255.0377.0x12. شخصيا ، رأيي هو أن هذه ممارسة سيئة ، ولكن مع ذلك ، وفقًا للاختبار ، فإن هذه الخيارات ممكنة وبالتالي ينبغي أخذ ذلك في الاعتبار.


مساعدة
  • 192.0.2.235 - عشري بفترات. يمكن التعبير عن تدوين شائع من 1 إلى 3 أرقام بين النقاط (القيم من 0 إلى 255).
  • 0300.0000.0002.0353 - ثماني بالنقاط. 4 أرقام بين النقاط ذات القيم من 0 إلى 7.
  • 0xC0.0x00.0x02.0xEB - ست عشري مع نقاط. أربعة أحرف بين النقاط. يؤدي "0x" ، ثم حرفين (من الأرقام أو من "a" إلى "f").
  • 0xC00002EC - ست عشري. يؤدي "0x" ، ثم 8 أحرف (قيم الأرقام أو من "a" إلى "f").
  • 287454020 - عشري. أي أرقام في النطاق من 0 إلى 4294967295.
  • 030000001353 - ثماني. بادئة 0. الأرقام من 0 إلى 7. النطاق من 0 إلى 07777777777777.

التعبير العادي سيكون رائعا.


قرار
 /^((((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])|(0x[\da-f]{2})|([0-7]{4}))\.){3}(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])|(0x[\da-f]{2})|([0-7]{4})))|(0x[\da-f]{8})|(0([0-7]{1,11}))|(2874540[2-8][0-9]|28745409[0-9]|287454[1-9][0-9]{2}|28745[5-9][0-9]{3}|2874[6-9][0-9]{4}|287[5-9][0-9]{5}|28[89][0-9]{6}|29[0-9]{7}|[3-9][0-9]{8}|[1-3][0-9]{9}|4[01][0-9]{8}|42[0-8][0-9]{7}|429[0-3][0-9]{6}|4294[0-8][0-9]{5}|42949[0-5][0-9]{4}|429496[0-6][0-9]{3}|4294967[01][0-9]{2}|42949672[0-8][0-9]|429496729[0-5]))$/i 

حل تحليل

بالنسبة لعناوين IP التي تحتوي على نقاط ، يكون الخلط ممكنًا ، لذلك نكتب خيارات من خلال "|" بواسطة مثل هذا النمط: ((عشري | سداسي عشري | ثماني).) {3} (عشري | سداسي عشري | ثماني).


  • "(\ d | [1-9] \ d | 1 \ d \ d | 2 [0-4] \ d | 25 [0-5])" - من أجل العلامة العشرية بنقطة السجل.
  • "(0x [\ da-f] {2})" - للست عشري بنقطة سجل.
  • "([0-7] {4})" - للأوكال مع نقطة تسجيل.

وتنسيقات التسجيل الأخرى:


  • "(0x [\ da-f] {8})" - للرموز السداسية العشرية.
  • "(2874540 [2-8] [0-9] | 28745409 [0-9] | 287454 [1-9] [0-9] {2} | 28745 [5-9] [0-9] {3} | 2874 [6-9] [0-9] {4} | 287 [5-9] [0-9] {5} | 28 [89] [0-9] {6} | 29 [0-9] {7} | [3-9] [0-9] {8} | [1-3] [0-9] {9} | 4 [01] [0-9] {8} | 42 [0-8 ] [0-9] {7} | 429 [0-3] [0-9] {6} | 4294 [0-8] [0-9] {5} | 42949 [0-5] [0-9 ] {4} | 429496 [0-6] [0-9] {3} | 4294967 [01] [0-9] {2} | 42949672 [0-8] [0-9] | 429496729 [0-5 ]) "- لتدوين عشري. وهنا ، يجب أن أعترف ، للتعبير الأقصر ، لقد خدعت من خلال تضمين عناوين IP العشرية فقط في نطاق الاختبار. للخير ، هنا تحتاج إلى النظر في أي أرقام من 0 إلى 4294967295. لكتابة هذا يدويًا ليست مهمة شاكرة ، لذلك نستخدمها .
  • (0 ([0-7] {1،11})) - لتدوين ثماني.

المهمة 7 - عناوين المواقع


http://callumacrae.imtqy.com/regex-tuesday/challenge7.html


من قائمة عناوين url ، ابحث عن صلاحية.


أمثلة للعناوين الصالحة:


 http://ab https://example.com/ http://test.this-test.com/ http://1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa 

مساعدة

يجب أن يبدأ العنوان بالضرورة في http: // أو https: // ، وينتهي بشرطة مائلة أو حرف (إذا كان مجالًا) أو رقمًا إذا كان عنوان IP. يمكن أن يكون لكل مجال مجال فرعي. وفقًا للمعيار ، لا يمكن أن يتجاوز طول كل مجال 63 حرفًا بطول إجمالي قدره 255 حرفًا . مجال تداخل في مجال فرعي يقتصر على 127 المجالات . لسوء الحظ ، لن يقوم محرك جافا سكريبت Regex بتمكين هذه القيود تمامًا ، لكن يمكنك كتابة تعبير يتوافق تقريبًا مع القواعد واجتياز الاختبار. شطب ما يمكن التحايل عليه من خلال ضبط المعلمات الأخرى.


قرار
 /^https?:\/\/(((\b[az\d-]{1,63}\b)\.){1,40}(\b[az\d-]{1,63}\b))\/?$/i 

حل تحليل
  • "^ https ؟: \ / \ /" - http: // or https: //

دعنا نحللها بشكل منفصل ((\ b [az \ d -] {1،63} \ b).) {1،40}


  • "\ b" في نهاية وبداية المجال للتأكد من أن المجال لا يبدأ ولا ينتهي بأي شيء غير صالح.
  • "[az \ d -] {1،63}" - داخل حروف اسم المجال ، يُسمح بالأرقام والواصلات بالداخل
  • "{1.63}" - كل هذا لا يتجاوز 63 حرفًا.
  • "((اسم المجال).) {1،40}" - أود أن أضع 127 هنا ، ولكن في التعبيرات العادية ، يشير الكمي {،} إلى الفاصل الزمني للتكرار. في حالة استخدام [] {} - هذا هو عدد الأحرف ، ولكن في الحالة بدون [] - هذا هو بالضبط عدد مرات تكرار القالب (اسم المجال).). لذلك ، نقصر التكرار على 40 حتى لا تتجاوز الحد الأقصى للطول العام ، والذي ، نحن أيضًا ، لهذا السبب ، لا يمكننا تعيينه بدقة.

المهمة 8 - تكرار العناصر


http://callumacrae.imtqy.com/regex-tuesday/challenge8.html


تشبه هذه المهمة المهمة 1 بعدة طرق ، ولكن عليك هنا العثور على العناصر المتكررة لقائمة MarkDown وإبرازها بنجمتين.


هذه القائمة:


 * Repeated list item * Repeated list item 

يجب تحويلها إلى هذا:


 * Repeated list item * **Repeated list item** 

مساعدة

نحن نستخدم رابط خلفي ، حرف تغذية سطر ، مفاتيح عالمية ، متعددة الخطوط وغير حساسة.


قرار

التعبير:


 /^(\*\s+([^\n]+)\n\*\s+)(\2)$/gmi 

بديل:


 $1**$3** 

المهمة 9 - MarkDown الروابط


http://callumacrae.imtqy.com/regex-tuesday/challenge9.html


استبدل روابط MarkDown الصالحة بروابط html.


مثال التحويل:


 [Another](http://example.com/) -> <a href="http://example.com/">Another</a> 

مساعدة

يمكن أن يتم ذلك دون النظر إلى أي شيء على الإطلاق ، أو بمجرد النظر إلى الأمام. بدلاً من النظر إلى الوراء ، إنه بديل.


قرار

التعبير:


 /(^|\s+)\[([^\]\[]+)\]\s*\((https?:\/\/\b[az\d-]+\b(\.[az-]+)*\.\w+\/*)\)(?=$|\s+)/i 

بديل:


 $1<a href="$3">$2</a> 

حل تحليل
  • "(^ | \ s +)" - قبل ارتباط MarkDown ، إما أن يتم السماح ببداية السطر أو المسافة. نأخذ هذا إلى المجموعة لاستبدال المساحة التي تم التقاطها في استبدال $ 1.
  • "[([^] [] +)] \ s *" - يُسمح بأية أحرف غير علامات الاقتباس المربعة في الرأس.
  • "(https :: \ / \ / \ b [az \ d -] + \ b (. [az -] +) . \ w + \ / )" - نتحقق من أن عنوان url صالح.
  • "(؟ = $ | \ s +)" - في النهاية إما مسافة أو نهاية سطر.

المهمة 10 - الكلمات الرئيسية


http://callumacrae.imtqy.com/regex-tuesday/challenge10.html


التحدي الأكثر المتشددين على الإطلاق. باستخدام التعبيرات المعتادة مع الاستبدالات ، حوّل النص الموجود إلى كلمات رئيسية مفصولة بفواصل.


اللائحة:


  • علامات الاقتباس هي كلمة رئيسية واحدة.
  • الأسماء الواصلة هي كلمة رئيسية واحدة.
  • الكلمة قد تحتوي على علامة اقتباس أحادية.
  • يجب إزالة الرموز (؛ - '").

مثال على ذلك:


لا تخبر سوزي سميث هوبر أنني كسرت لعبة دانييل


يجب تحويلها إلى هذا:


لا ، أخبرني ، سوزي ، سميث هوبر ، أنني ، كسرت ، لعبة دانيال ، حصان


لا يبدو الأمر معقدًا للوهلة الأولى ، لكنه لا يبدو معقدًا. والحقيقة هي أن هذه المشكلة لا يتم حلها ولا يتم وضعها في شكلها النهائي مع تعبير واحد منتظم فقط مع بديل. لكن حالات الاختبار مصممة بطريقة تجعل كل شيء حل المشكلة ممكنًا.


مساعدة

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


قرار

التعبير:


 /\s(['"])([^'"]+)\1|(;? |['"]? | ['"]|-{2,})(\w+)/g 

بديل:


 ,$2$4 

حل تحليل

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


  • "\ s (['"]) ([^' "] +)" - استبدل القالب {space "للكلمة بمسافة بين علامات اقتباس"} بواسطة {، الكلمات بمسافة} . "\ s" هنا ليس مثل هذا فقط ، ولكن من أجل استبعاد الحوادث الزائفة مع علامات الاقتباس الموضوعة بشكل غير صحيح.
  • "(؛؟ | ['"]؟ | [' "] | - {2،}) (\ w +)" - ثم هناك كلمات فردية مسبوقة بأحرف تحتاج إلى حذفها ، وفاصلة قبل هذه الكلمات.

Source: https://habr.com/ru/post/ar474184/


All Articles