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

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

نشرت في المجموعة
RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية الجزء 1. RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية. الجزء 2: في هذا الجزء سننتقل إلى الأشياء الأكثر تعقيدًا بعض الشيء. لكن إتقانها، كما كان من قبل، لن يكون صعبا. أكرر أن RegEx هو في الواقع أسهل مما قد يبدو في البداية، ولا تحتاج إلى أن تكون عالم صواريخ لإتقانه والبدء في استخدامه عمليًا. النسخة الإنجليزية الأصلية لهذه المقالة موجودة هنا . 20 خطوة قصيرة لإتقان التعبيرات العادية.  الجزء 3 - 1

الخطوة 11: الأقواس ()كمجموعات الالتقاط

20 خطوة قصيرة لإتقان التعبيرات العادية.  الجزء 3 - 2في المشكلة الأخيرة، بحثنا عن أنواع مختلفة من القيم الصحيحة والقيم الرقمية للفاصلة العائمة (النقطة). لكن محرك التعبير العادي لم يفرق بين هذين النوعين من القيم، حيث تم التقاط كل شيء في تعبير عادي واحد كبير. يمكننا أن نطلب من محرك التعبير العادي أن يفرق بين الأنواع المختلفة من التطابقات إذا وضعنا أنماطنا المصغرة بين قوسين:
النمط: ([AZ])|([az]) 
السلسلة:   رئيس بوليفيا الحالي هو إيفو موراليس .
المباريات: ^^^ ^^^^^^^ ^^^^^^^^^ ^^ ^^^^^^ ^^ ^^^ ^^^^^^^ 
المجموعة:    122 2222222 122222222 22 1222222 22 122 1222222  
( مثال ) يحدد التعبير العادي أعلاه مجموعتي التقاط يتم فهرستهما بدءًا من 1. تتطابق مجموعة الالتقاط الأولى مع أي حرف كبير واحد، وتتطابق مجموعة الالتقاط الثانية مع أي حرف صغير واحد. باستخدام علامة "أو" |والأقواس ()كمجموعة التقاط، يمكننا تحديد تعبير عادي واحد يطابق أنواعًا متعددة من السلاسل. إذا طبقنا ذلك على تعبير البحث الطويل/العائم الخاص بنا من الجزء السابق من المقالة، فسيقوم محرك التعبير العادي بالتقاط المطابقات المقابلة في المجموعات المناسبة. من خلال التحقق من المجموعة التي تطابقها السلسلة الفرعية، يمكننا على الفور تحديد ما إذا كانت قيمة عائمة أم قيمة طويلة:
النمط: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) السلسلة: 42L 
12   x 3.4f 6l 3.3 0F LF .2ف 0.
المباريات: ^^^ ^^^^ ^^ ^^ ^^^ 
المجموعة:    222 1111 22 11 111  
( مثال ) هذا التعبير النمطي معقد للغاية، ولفهمه بشكل أفضل، دعونا نقسمه وننظر إلى كل من هذه الأنماط:
( // يطابق أي سلسلة فرعية "عائمة".
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| //أو
( // يطابق أي سلسلة فرعية "طويلة".
  \د+[ل]
)
تسمح لنا مجموعات الإشارة |والالتقاط الموجودة بين قوسين ()بمطابقة أنواع مختلفة من السلاسل الفرعية. في هذه الحالة، نقوم بمطابقة أرقام الفاصلة العائمة "تعويم" أو الأعداد الصحيحة الطويلة "طويلة".
(
  \d*\.\d+[fF] // 1+ أرقام على يمين العلامة العشرية
  |
  \d+\.\d*[fF] // 1+ أرقام على يسار العلامة العشرية
  |
  \d+[fF] // بدون نقطة، فقط أكثر من رقم واحد
)
|
(
  \d+[lL] // بدون نقطة، فقط أكثر من رقم واحد
)
في مجموعة الالتقاط "العائمة"، لدينا ثلاثة خيارات: الأرقام التي تحتوي على رقم واحد على الأقل على يمين العلامة العشرية، والأرقام التي تحتوي على رقم واحد على الأقل على يسار العلامة العشرية، والأرقام التي لا تحتوي على علامة عشرية. تعتبر أي منها "عائمة" طالما تم إلحاق الحرفين "f" أو "F" في نهايتها. داخل مجموعة الالتقاط "الطويلة"، لدينا خيار واحد فقط - يجب أن يكون لدينا رقم واحد أو أكثر متبوعًا بالحرف "l" أو "L". سيبحث محرك التعبير العادي عن هذه السلاسل الفرعية في سلسلة معينة ويقوم بفهرستها في مجموعة الالتقاط المناسبة. ملحوظةأننا لا نطابق أيًا من الأرقام التي لم تتم إضافة أي من "l" أو "L" أو "f" أو "F" إليها. كيف ينبغي تصنيف هذه الأرقام؟ حسنًا، إذا كانت لديهم علامة عشرية، فستكون لغة Java افتراضية على "مزدوج". وإلا فإنها يجب أن تكون "كثافة العمليات".

دعونا ندمج ما تعلمناه مع بعض الألغاز:

أضف مجموعتي التقاط أخريين إلى التعبير العادي أعلاه بحيث يصنف أيضًا أرقامًا مزدوجة أو أرقامًا صحيحة. (هذا سؤال صعب آخر، لا تثبط عزيمتك إذا استغرق الأمر بعض الوقت، كحل أخير، انظر الحل الخاص بي.)
نمط:
السلسلة:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
المباريات: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ 
المجموعة:    333 44 1111 33 222 11 111 22
( الحل ) المشكلة التالية أبسط قليلاً. استخدم مجموعات الالتقاط بين قوسين ()وعلامة "أو" |ونطاقات الأحرف لفرز الأعمار التالية: "شرب قانوني في الولايات المتحدة". (>= 21) و"غير مسموح بالشرب في الولايات المتحدة الأمريكية" (<21):
نمط:
السلسلة:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
تطابقات: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
المجموعة:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( حل )

الخطوة 12: تحديد المزيد من التطابقات المحددة أولاً

20 خطوة قصيرة لإتقان التعبيرات العادية.  الجزء 3 - 3ربما واجهت بعض المشاكل مع المهمة الأخيرة إذا حاولت تعريف "الشاربين القانونيين" كمجموعة الالتقاط الأولى بدلاً من الثانية. لفهم السبب، دعونا ننظر إلى مثال آخر. لنفترض أننا نريد تسجيل الألقاب التي تحتوي على أقل من 4 أحرف بشكل منفصل والألقاب التي تحتوي على 4 أحرف أو أكثر بشكل منفصل. دعونا نعطي أسماء أقصر لمجموعة الالتقاط الأولى ونرى ما سيحدث:
النمط: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
سلسلة:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
المباريات: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
المجموعة:    111 111 11 111 111 111 111   
( مثال ) بشكل افتراضي، تستخدم معظم محركات التعبير العادي المطابقة الجشعة مع الأحرف الأساسية التي رأيناها حتى الآن. وهذا يعني أن محرك التعبير العادي سوف يلتقط أطول مجموعة محددة في أقرب وقت ممكن في التعبير العادي المقدم. لذلك، في حين أن المجموعة الثانية أعلاه يمكنها التقاط المزيد من الأحرف في أسماء مثل "Jobs" و"Cloyd" على سبيل المثال، ولكن نظرًا لأن الأحرف الثلاثة الأولى من تلك الأسماء تم التقاطها بالفعل بواسطة مجموعة الالتقاط الأولى، فلا يمكن التقاطها مرة أخرى بواسطة المجموعة الثانية . الآن دعونا نجري تصحيحًا بسيطًا - ما عليك سوى تغيير ترتيب مجموعات الالتقاط، ووضع المجموعة الأكثر تحديدًا (الأطول) أولاً:
النمط: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
سلسلة:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
المباريات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
المجموعة:    222 1111 22 11111 1111 222 1111    
( مثال )

المهمة... هذه المرة واحدة فقط :)

النمط "الأكثر تحديدًا" يعني دائمًا "أطول". لنفترض أننا نريد العثور على نوعين من "الكلمات": أولاً تلك التي تبدأ بحروف العلة (بشكل أكثر تحديدًا)، ثم تلك التي لا تبدأ بحروف العلة (أي كلمة أخرى). حاول كتابة تعبير عادي لالتقاط وتحديد السلاسل التي تطابق هاتين المجموعتين. (المجموعات أدناه مكتوبة بالحروف وليست مرقمة. يجب عليك تحديد المجموعة التي يجب أن تتوافق مع المجموعة الأولى وأيها يجب أن تتوافق مع الثانية.)
نمط:
السلسلة:   pds6f uub 24r2gp ewqrty l ui_op 
التطابقات: ^^^^^ ^^^ ^^^^^^ ^ ^^^^^ ^ ^^^^^ 
المجموعة:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( الحل ) بشكل عام، كلما كان التعبير النمطي أكثر دقة، كلما طال أمده. وكلما كان الأمر أكثر دقة، قل احتمال التقاط شيء لا تحتاجه. لذلك، على الرغم من أنها قد تبدو مخيفة، إلا أن التعبيرات العادية الأطول ~= تعبيرات عادية أفضل. للأسف .

الخطوة 13: الأقواس المتعرجة {}لعدد محدد من التكرارات

20 خطوة قصيرة لإتقان التعبيرات العادية.  الجزء 3 - 4في المثال الذي يحتوي على الأسماء الأخيرة من الخطوة السابقة، كان لدينا مجموعتان متكررتان تقريبًا في نمط واحد:
النمط: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
سلسلة:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
المباريات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
المجموعة:    222 1111 22 11111 1111 222 1111    
بالنسبة للمجموعة الأولى، كنا بحاجة إلى أسماء عائلة مكونة من أربعة أحرف أو أكثر. كان على المجموعة الثانية التقاط ألقاب مكونة من ثلاثة أحرف أو أقل. هل هناك طريقة أسهل لكتابة هذا من تكرار هذه [a-z]المجموعات مرارًا وتكرارًا؟ موجود إذا كنت تستخدم الأقواس المتعرجة لهذا الغرض {}. تسمح لنا الأقواس المتعرجة {}بتحديد الحد الأدنى والحد الأقصى (اختياريًا) لعدد التطابقات مع الشخصية السابقة أو مجموعة الالتقاط. هناك ثلاث حالات استخدام {}:
{X} // يتطابق تمامًا مع X مرة
{X,} // يطابق >= X مرة
{X,Y} // يتطابق مع >= X و<= Y مرات
فيما يلي أمثلة على بناء الجملة الثلاثة المختلفة:
النمط: [az]{11} 
السلسلة:   humuhumunuk unukuapua'a.
التطابقات: ^^^^^^^^^^^   
( مثال )
النمط: [az]{18,} 
السلسلة:   humuhumunukunukuapua 'a.
التطابقات: ^^^^^^^^^^^^^^^^^^^^^    
( مثال )
النمط: [az]{11,18} 
السلسلة:   humuhumunukunukuap ua'a.
التطابقات: ^^^^^^^^^^^^^^^^^^    
( مثال ) هناك عدة نقاط يجب ملاحظتها في الأمثلة المذكورة أعلاه.ملحوظة:. أولاً، باستخدام التدوين {X}، سيتطابق الحرف أو المجموعة السابقة تمامًا مع هذا الرقم (X) مرات. إذا كان هناك عدد أكبر من الأحرف في "الكلمة" (أكثر من الرقم X) التي يمكن أن تتطابق مع النمط (كما هو موضح في المثال الأول)، فلن يتم تضمينها في المطابقة. إذا كان عدد الأحرف أقل من X، فستفشل المطابقة الكاملة (حاول تغيير 11 إلى 99 في المثال الأول). ثانيًا، الرموز {X,} و{X,Y} جشعة. سيحاولون مطابقة أكبر عدد ممكن من الأحرف مع الاستمرار في استيفاء التعبير العادي المحدد. إذا حددت {3،7} فيمكن مطابقة 3 إلى 7 أحرف وإذا كانت الأحرف السبعة التالية صالحة، فستتم مطابقة جميع الأحرف السبعة. إذا حددت {1،} وتطابقت كافة الأحرف التالية البالغ عددها 14000 حرف، فسيتم تضمين جميع هذه الأحرف البالغ عددها 14000 حرفًا في السلسلة المقابلة. كيف يمكننا استخدام هذه المعرفة لإعادة كتابة التعبير أعلاه؟ قد يكون أبسط تحسين هو استبدال المجموعات المجاورة [a-z]بـ [a-z]{N}، حيث يتم اختيار N وفقًا لذلك:
النمط: ([AZ][az]{2}[az]+)|([AZ][az]?[az]?)  
...ولكن هذا لا يجعل الأمور أفضل بكثير. انظر إلى مجموعة الالتقاط الأولى: لدينا [a-z]{2}(الذي يطابق حرفين صغيرين تمامًا) متبوعًا بـ [a-z]+(الذي يطابق حرفًا صغيرًا واحدًا أو أكثر). يمكننا تبسيط ذلك من خلال طلب 3 أحرف صغيرة أو أكثر باستخدام الأقواس المتعرجة:
النمط: ([AZ][az]{3,})|([AZ][az]?[az]?) 
مجموعة الالتقاط الثانية مختلفة. لا نحتاج إلى أكثر من ثلاثة أحرف في هذه الأسماء الأخيرة، مما يعني أن لدينا حدًا أعلى، أما الحد الأدنى لدينا فهو صفر:
النمط: ([AZ][az]{3,})|([AZ][az]{0,2}) 
تكون الخصوصية دائمًا أفضل عند استخدام التعبيرات العادية، لذا سيكون من الحكمة التوقف عند هذا الحد، لكن لا يسعني إلا أن ألاحظ أن هذين النطاقين من الأحرف ( [AZ]و [az]) بجوار بعضهما البعض يبدوان تقريبًا مثل فئة "حرف الكلمة"، \w( [A-Za-z0-9_]) . إذا كنا واثقين من أن بياناتنا تحتوي فقط على أسماء عائلة منسقة جيدًا، فيمكننا تبسيط التعبير النمطي والكتابة ببساطة:
النمط: (\ث{4,})|(\ث{1,3}) 
تلتقط المجموعة الأولى أي تسلسل مكون من 4 "أحرف كلمة" أو أكثر ( [A-Za-z0-9_])، وتلتقط المجموعة الثانية أي تسلسل من 1 إلى 3 "أحرف كلمة" (شاملة). هل سيعمل هذا؟
النمط: (\w{4,})|(\w{1,3}) 
السلسلة:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
المباريات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
المجموعة:    222 1111 22 11111 1111 222 1111    
( مثال ) نجحت! ماذا عن هذا النهج؟ وهو أنظف بكثير من مثالنا السابق. نظرًا لأن مجموعة الالتقاط الأولى تتطابق مع جميع الألقاب التي تحتوي على أربعة أحرف أو أكثر، فيمكننا أيضًا تغيير مجموعة الالتقاط الثانية إلى ببساطة \w+، لأن هذا سيسمح لنا بالتقاط جميع الألقاب المتبقية (مع 1 أو 2 أو 3 أحرف):
النمط: (\w{4,})|(\w+) 
السلسلة:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
المباريات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ 
المجموعة:    222 1111 22 11111 1111 222 1111    
( مثال )

دعونا نساعد الدماغ على تعلم ذلك وحل المشكلتين التاليتين:

استخدم الأقواس المتعرجة {}لإعادة كتابة التعبير العادي للبحث عن رقم الضمان الاجتماعي من الخطوة 7:
نمط:
السلسلة: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
التطابقات:              ^^^^^^^^^^^
( الحل ) افترض أن مدقق قوة كلمة المرور لموقع الويب يتطلب أن تتراوح كلمات مرور المستخدم بين 6 و12 حرفًا. اكتب تعبيرًا عاديًا يشير إلى كلمات المرور غير الصالحة في القائمة أدناه. كل كلمة مرور موجودة بين قوسين ()لسهولة المطابقة، لذا تأكد من أن التعبير العادي يبدأ وينتهي بأحرف حرفية (ورمزية ). تلميح: تأكد من عدم السماح بالأقواس الحرفية في كلمات المرور المشابهة [^()]أو المشابهة، وإلا فسوف ينتهي بك الأمر إلى مطابقة السلسلة بأكملها!
نمط:
السلسلة:   (12345) (كلمة المرور الخاصة بي) (Xanadu.2112) (su_do) (OfSalesmen!)
التطابقات: ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^  
( حل )

الخطوة 14: \bرمز الحدود ذات العرض الصفري

20 خطوة قصيرة لإتقان التعبيرات العادية.  الجزء 3 - 5وكانت المهمة الأخيرة صعبة للغاية. ولكن ماذا لو جعلنا الأمر أكثر تعقيدًا من خلال وضع كلمات المرور بين علامتي اقتباس ""بدلاً من الأقواس ()؟ هل يمكننا كتابة حل مماثل ببساطة عن طريق استبدال جميع أحرف الأقواس بأحرف الاقتباس؟
Pattern: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
string:   "12345" "كلمة المرور الخاصة بي" "Xanadu.2112 " " su_do" " OfSalesmen! "
التطابقات: ^^^^^^^ ^^^^^^^^^^^^^ ^^^ ^^^  
( مثال ) لم يكن الأمر مثيرًا للإعجاب. هل خمنت بالفعل لماذا؟ المشكلة هي أننا نبحث عن كلمات مرور غير صحيحة هنا. "Xanadu.2112" هي كلمة مرور جيدة، لذلك عندما يدرك التعبير العادي أن هذا التسلسل لا يحتوي على مسافات أو أحرف حرفية "، فإنه ينتج قبل الحرف "الذي يؤهل كلمة المرور على الجانب الأيمن. (لأننا حددنا أنه "لا يمكن العثور على الأحرف داخل كلمات المرور باستخدام [^"].) بمجرد اقتناع محرك التعبير العادي بأن هذه الأحرف لا تتطابق مع تعبير عادي معين، فإنه يعمل مرة أخرى، بالضبط من حيث توقف - حيث كان الحرف ". مما يحد " Xanadu.2112" على اليمين. ومن هناك يرى حرفًا فضائيًا وحرفًا آخر "- بالنسبة له، هذه كلمة مرور خاطئة! في الأساس، يجد هذا التسلسل " "ويتحرك. هذا ليس ما نود الحصول عليه على الإطلاق... سيكون من الرائع أن نتمكن من تحديد أن الحرف الأول من كلمة المرور يجب ألا يكون مسافة. هل هناك طريقة للقيام بذلك؟ (الآن، ربما تكون قد أدركت أن الإجابة على جميع أسئلتي البلاغية هي "نعم".) نعم! هناك مثل هذه الطريقة! توفر العديد من محركات التعبير العادي تسلسل هروب مثل "حدود الكلمات" \b. "حدود الكلمة" \bعبارة عن تسلسل هروب ذي عرض صفري والذي، بشكل غريب، يتطابق مع حد الكلمة. تذكر أننا عندما نقول "كلمة"، فإننا نعني إما أي تسلسل من الأحرف في الفصل \wأو [A-Za-z0-9_]. تعني مطابقة حدود الكلمة أن الحرف الذي يسبق التسلسل مباشرة أو بعده مباشرة \bيجب أن يكون неحرفًا كلمة. ومع ذلك، عند المطابقة، لا نقوم بتضمين هذا الحرف في السلسلة الفرعية التي تم التقاطها. هذا عرض صفر. لمعرفة كيفية عمل ذلك، دعونا نلقي نظرة على مثال صغير:
النمط: \b[^]+\b 
السلسلة:   لا يزال لديك أموال ، Lebowski .
التطابقات: ^^ ^^^^^ ^^^^ ^^ ^^^^^ ^^^^^^^^  
( مثال ) يجب أن يتطابق التسلسل [^ ]مع أي حرف ليس حرف مسافة. فلماذا لا يتطابق هذا مع الفاصلة ,بعد المال أو النقطة " .بعد ليبوفسكي؟ وذلك لأن الفاصلة ,والنقطة .ليسا أحرفًا كلمة، لذلك يتم إنشاء حدود بين الأحرف الكلمة والأحرف غير الكلمة. تظهر بين yنهاية كلمة المال والفاصلة ,التي تليها، وبين iكلمة ليبوفسكي والنقطة .(النقطة) التي تليها. يتطابق التعبير العادي مع حدود هذه الكلمات (ولكن ليس مع الأحرف غير الكلمة التي تساعد فقط في تعريفها). ولكن ماذا يحدث إذا لم نقم بتضمين الاتساق \bفي قالبنا؟
النمط: [^ ]+ 
سلسلة:   مازلت ترغب في الحصول على المال، ليبوسكي. 
التطابقات: ^^ ^^^^^ ^^^^ ^^ ^^^^^^ ^^^^^^^^^  
( مثال ) نعم، الآن نجد علامات الترقيم هذه أيضًا. لنستخدم الآن حدود الكلمات لإصلاح التعبير العادي لكلمات المرور المقتبسة:
النمط: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
string:   "12345" "كلمة المرور الخاصة بي" " Xanadu. 2112" "su_do" "من المبيعات!"
التطابقات: ^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^  
( مثال ) من خلال وضع حدود الكلمات داخل علامات الاقتباس ("\b ... \b")، فإننا نقول بشكل فعال أن الحرف الأول والأخير من كلمات المرور المطابقة يجب أن يكون "أحرف كلمة". لذلك يعمل هذا بشكل جيد هنا، ولكنه لن يعمل أيضًا إذا كان الحرف الأول أو الأخير من كلمة مرور المستخدم ليس حرفًا كلمة:
النمط: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
السلسلة: "كلمة المرور التالية قصيرة جدًا" "C++"
اعواد الكبريت:   
( مثال ) انظر كيف لم يتم وضع علامة على كلمة المرور الثانية على أنها "غير صالحة" على الرغم من أنها قصيرة جدًا بشكل واضح. يجب ان تكونحذرمع تسلسلات \b، لأنها تطابق فقط الحدود بين الأحرف \wوليس \w. في المثال أعلاه، نظرًا لأننا سمحنا بأحرف لا ، في كلمات المرور \w، فإن الحد بين \الحرف الأول/الأخير من كلمة المرور ليس مضمونًا أن يكون حدًا للكلمة \b.

لإكمال هذه الخطوة، سوف نقوم بحل مشكلة واحدة بسيطة فقط:

تعد حدود الكلمات مفيدة في محركات تمييز بناء الجملة عندما نريد مطابقة تسلسل معين من الأحرف، ولكننا نريد التأكد من أنها تحدث فقط في بداية الكلمة أو نهايتها (أو بمفردها). لنفترض أننا نكتب تسليط الضوء على بناء الجملة ونريد تسليط الضوء على الكلمة var، ولكن فقط عندما تظهر بمفردها (دون لمس الأحرف الأخرى في الكلمة). هل يمكنك كتابة تعبير عادي لهذا؟ بالطبع يمكنك ذلك، إنها مهمة بسيطة جدًا ;)
نمط:
السلسلة:   var varx _var ( var j) barvarcar * var var -> { var }
التطابقات: ^^^ ^^^ ^^^ ^^^ ^^^  
( حل )

الخطوة 15: "علامة الإقحام" ^كـ "بداية السطر" وعلامة الدولار $كـ "نهاية السطر"

20 خطوة قصيرة لإتقان التعبيرات العادية.  الجزء 3 - 6تسلسل حدود الكلمة \b(من الخطوة الأخيرة من الجزء السابق من المقالة) ليس هو التسلسل الخاص الوحيد ذو العرض الصفري المتاح للاستخدام في التعبيرات العادية. النوعان الأكثر شيوعًا هما "علامة الإقحام" ^- "بداية السطر" وعلامة الدولار $- "نهاية السطر". إن تضمين أحد هذه العناصر في تعبيراتك العادية يعني أن المطابقة يجب أن تظهر في بداية السلسلة المصدر أو نهايتها:
النمط: ^start|end$ 
السلسلة:   start end start end start end start end 
matchs: ^^^^^ ^^^  
( مثال ) إذا كانت سلسلتك تحتوي على فواصل أسطر، فسوف ^startتتطابق مع التسلسل "البداية" في بداية أي سطر، وسوف end$تتطابق مع التسلسل "النهاية" في نهاية أي سطر (على الرغم من صعوبة إظهار ذلك هنا). تعتبر هذه الرموز مفيدة بشكل خاص عند العمل مع البيانات التي تحتوي على محددات. دعنا نعود إلى مشكلة "حجم الملف" من الخطوة 9 باستخدام ^"بداية السطر". في هذا المثال، يتم فصل أحجام ملفاتنا بمسافات " ". لذلك نريد أن يبدأ كل حجم ملف برقم، يسبقه مسافة أو بداية السطر:
النمط: (^| )(\d+|\d+\.\d+)[KMGT] 
سلسلة B:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
المباريات: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
المجموعة:    222 122 1222 12    
( مثال ) لقد اقتربنا بالفعل من الهدف! ولكن قد تلاحظ أنه لا تزال لدينا مشكلة صغيرة: نحن نطابق حرف المسافة قبل الحجم الصحيح للملف. يمكننا الآن ببساطة تجاهل مجموعة الالتقاط هذه (1) عندما يجدها محرك التعبير العادي لدينا، أو يمكننا استخدام مجموعة غير ملتقطة، وهو ما سنراه في الخطوة التالية.

في هذه الأثناء، دعونا نحل مشكلتين أخريين تتعلقان بالنغمة:

بالاستمرار في مثال تمييز بناء الجملة الخاص بنا من الخطوة الأخيرة، فإن بعض تمييز بناء الجملة سيضع علامة على المسافات الزائدة، أي أي مسافات تأتي بين حرف غير مسافات بيضاء ونهاية السطر. هل يمكنك كتابة تعبير عادي لتسليط الضوء على المسافات الزائدة فقط؟
نمط:
السلسلة: myvec <- c(1, 2, 3, 4, 5)  
التطابقات:                          ^^^^^^^  
( الحل ) سيبحث محلل بسيط للقيم المفصولة بفواصل (CSV) عن "الرموز المميزة" مفصولة بفواصل. بشكل عام، الفضاء ليس له معنى إلا إذا كان محاطًا بعلامات اقتباس "". اكتب تعبيرًا عاديًا بسيطًا لتحليل ملف CSV يطابق الرموز المميزة بين الفواصل، لكنه يتجاهل (لا يلتقط) المسافة البيضاء غير الموجودة بين علامات الاقتباس.
نمط:
السلسلة:   a، "b"، "c d"، e، f، "g h"، dfgi،، k، ""، l 
التطابقات: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^ ^^ ^^^ ^ 
المجموعة:    21 2221 2222212121 222221 222211 21 221 2    
( الحل ) RegEx: 20 خطوة قصيرة لإتقان التعبيرات العادية. الجزء 4.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION