كانت المهمة التي جعلتني أبني هذا مملة، ولهذا السبب بالضبط كان الأمر يستحق التشغيل الآلي. سلمني أحد العملاء تصديرًا مكونًا من 4000 سطر حيث تمت كتابة كل تاريخ على الطريقة الأمريكية 01/15/2024والنظام الذي كان يتجه إليه مطلوب ISO، 2024-01-15. لم يتمكن البحث والاستبدال البسيط من لمسه، لأنه لم تكن هناك سلسلة ثابتة للبحث عنها - كانت التواريخ كلها مختلفة. ما شاركوه كان أ شكل: رقمان، شرطة مائلة، رقمان، شرطة مائلة، أربعة أرقام. هذا هو بالضبط نوع الشيء الذي يطابقه التعبير العادي، وهو بالضبط نوع الشيء الذي يعيد بديل regex كتابته في تمريرة واحدة. لقد قمت بلصق الملف في أداة خدش، وكتبت تعبيرًا واحدًا، وقلب تنسيق التصدير بالكامل في أقل من ثانية.
هذه هي الوظيفة المجانية استبدال ريجكس الأداة تفعل ذلك، وهذا الدليل هو النسخة الطويلة لكيفية استخدامها بشكل جيد. سأغطي ما هو بديل regex في الواقع، وكيف تتيح لك المراجع الخلفية لمجموعة الالتقاط إعادة هيكلة النص بدلاً من حذفه فقط، وما يعنيه كل رمز بديل خاص، والأخطاء التي تؤدي إلى تعثر الأشخاص. يجلس بجوار اختبار regex لقد كتبت عنها بشكل منفصل - يخبرك المختبر بما يطابقه النمط، وتعيد هذه الأداة كتابة ما يطابقه. إذا كانت التعبيرات العادية نفسها جديدة بالنسبة لك، فابدأ بـ دليل كامل لأدوات الترميز و عد.
ليرة تركية؛DR: يقوم استبدال regex بمطابقة النص حسب النمط وإعادة كتابة كل تطابق باستخدام سلسلة بديلة. قم بلف الأجزاء التي تريد إعادة استخدامها بين قوسين لإنشاء مجموعات مرقمة، ثم قم بالإشارة إليها في الاستبدال بـ
$1،$2وما إلى ذلك - النمط(\d{4})-(\d{2})-(\d{2})مع الاستبدال$3/$2/$1المنعطفات2024-01-15في15/01/2024. تشغيلgضع علامة لاستبدال كل مباراة، واترك البديل فارغًا لحذف التطابقات، واستخدمه$<name>للمجموعات المسماة. ال استبدال ريجكس تعمل الأداة بالكامل في متصفحك وتعرض عدد البدائل مباشرة.
ما هو بديل ريجكس؟
يعمل البحث والاستبدال العادي على النص الحرفي: تكتب الكلمة التي تبحث عنها بالضبط والكلمة الدقيقة التي ستضعها في مكانها. إنه يفشل في اللحظة التي لا يكون فيها الشيء الذي تريد تغييره سلسلة ثابتة بل نمطًا - تاريخ بأي من مائة نموذج، ورقم هاتف، وعلامة HTML، ومسافة بيضاء زائدة، واسم متغير يتبع اصطلاحًا. يصف التعبير العادي هذا النمط، ويقوم بديل regex بإقرانه بقالب يوضح كيفية إعادة كتابة كل تطابق.
الآلية لها نصفين. ال نمط هو تعبير عادي يقوم المحرك بمسح النص به، ليجد كل مكان يحدث فيه الشكل. ال بديل هي سلسلة يتم استبدالها في كل مباراة. في أبسط الحالات، يكون الاستبدال نصًا عاديًا وتصبح كل مطابقة هي نفس الشيء - وهو أمر مفيد لتطبيع، على سبيل المثال، كل تشغيل لعلامات التبويب والمسافات في مساحة واحدة. الحالة القوية هي عندما يشير الاستبدال مرة أخرى إلى أجزاء مما تمت مطابقته، وبالتالي يتم إنشاء الإخراج من الإدخال بدلاً من أن يكون ثابتًا. وهذا ما يحول استبدال regex من الحذف وإعادة الكتابة غير الحادة إلى أداة إعادة هيكلة حقيقية.
تحت غطاء محرك السيارة، استبدال ريجكس تستخدم الأداة جافا سكريبت RegExp المحرك و String.prototype.replace الطريقة التي يأتي بها كل متصفح وNode.js. وهذا مهم لسبب عملي: السلوك الذي تراه في الأداة مطابق للسلوك الذي ستحصل عليه إذا قمت بلصق نفس النمط والاستبدال في كود JavaScript أو TypeScript الخاص بك. لا توجد نكهة منفصلة للتعلم ولا توجد مفاجأة عند الانتقال من أداة الخدش إلى الإنتاج. بناء الجملة البديل الذي تقبله الأداة - $1، $&، $<name> والباقي - هو بناء الجملة الدقيق الذي يحدده المعيار، والموثق عليه MDN'؛s String.replace مرجع.
كيف تعمل المراجع الخلفية لمجموعة الالتقاط؟
هذه هي الفكرة الوحيدة الأكثر فائدة في استبدال regex، وهي تستحق التباطؤ من أجلها. عندما تضع جزءًا من النمط بين قوسين، فإنك تقوم بإنشاء التقاط المجموعة. يتذكر المحرك النص المطابق لتلك المجموعة، ويقوم بترقيم المجموعات من اليسار إلى اليمين بدءًا من واحدة. في سلسلة الاستبدال، $1 يعني "؛ أدخل ما استولت عليه المجموعة الأولى، واقتبس؛ $2 والثاني، وهكذا حتى $99.
مثال التاريخ يجعله ملموسًا. النمط (\d{4})-(\d{2})-(\d{2}) يتكون من ثلاث مجموعات: السنة المكونة من أربعة أرقام، والشهر المكون من رقمين، واليوم المكون من رقمين. عندما يتطابق 2024-01-15، المجموعة الأولى تحمل 2024، المجموعة الثانية تحمل 01والمجموعة الثالثة تحمل 15. استبدال $3/$2/$1 ثم يتم تجميع سلسلة جديدة من تلك القطع بترتيب مختلف وبفواصل مختلفة، مما ينتج عنه 15/01/2024. لم يتم حذف أي شيء وإعادة كتابته - تتم إعادة بناء الإخراج حرفيًا من الأجزاء التي تم التقاطها. أعد ترتيب الرموز المميزة، وقم بتغيير علامات الترقيم بينها، ولفها في نص آخر، وقمت بإعادة تنسيق كل تاريخ في الملف بتعبير واحد.
المجموعات المسماة هي نفس الفكرة مع تسميات قابلة للقراءة. بدلا من عد الأقواس، تكتب (?<year>\d{4}) وارجع إليه في البديل كـ $<year>. بالنسبة للنمط الذي يحتوي على مجموعتين أو ثلاث مجموعات، تكون الأرقام جيدة، ولكن بمجرد التوفيق بين خمس أو ست مجموعات، فإن الأسماء تجعل قراءة كل من النمط والاستبدال أسهل بكثير وتغييرهما لاحقًا. تدعم الأداة كليهما بالتبادل، حتى تتمكن من المزج $1 و $<name> في نفس الاستبدال إذا أردت. عندما تقوم أولاً بتجميع نمط ولا تكون متأكدًا بعد من المجموعات التي تحتاجها، فإن regex builder يساعدك على بنائه قطعة قطعة قبل إحضاره إلى هنا لتشغيل البديل.
ماذا تعني الرموز البديلة الخاصة؟
تعتبر علامة الدولار مميزة داخل سلسلة بديلة، وتقدم مجموعة صغيرة من الرموز المميزة خارج المجموعات المرقمة والمسماة. معرفتها تنقذك من الوصول إلى نمط أكثر تعقيدًا مما تحتاج إليه.
$& يُدرج السلسلة الفرعية المتطابقة بالكامل. هذا ما تريده عندما تقوم بتغليف التطابقات أو التعليق عليها بدلاً من إعادة بنائها - وهو نمط من \b\w+@\w+\.\w+\b مع استبدال <$&> ضع أقواسًا زاوية حول كل عنوان بريد إلكتروني دون الحاجة إلى التقاط كل شيء في مجموعة. $\`` (a backtick) inserts everything *before* the match, and $'؛(an apostrophe) inserts everything *after* it; these are rarely needed but occasionally exactly right. And becauseدولارis special, outputting a literal dollar sign requires doubling it:دولار $in the replacement produces a single$` في المخرجات، وهو أمر مهم في اليوم الذي تقوم فيه بإعادة تنسيق العملة.
هناك لغة حذف واحدة تستحق الالتزام بها في الذاكرة: الاستبدال الفارغ يزيل كل تطابق. مع وضع العلامة العامة وترك حقل الاستبدال فارغًا، تقوم الأداة بحذف كل تكرار للنمط من النص. هذه هي أنظف طريقة لتجريد شيء ما - جميع علامات HTML بها <[^>]+>، كل مساحة زائدة مع +$ في الوضع متعدد الأسطر، جميع الأرقام غير الرقمية من رقم الهاتف مع \D. أنت لا تستبدل بمسافة أو عنصر نائب؛ أنت تستبدل بلا شيء، وتختفي المباراة ببساطة.
ما هي الأعلام التي تهم الاستبدال؟
تغير الأعلام الموجودة على regex كيفية تطبيقها، ويهيمن اثنان منها على أعمال الاستبدال اليومية. والباقي ظرفي ولكنه حاسم في بعض الأحيان.
العلم العالمي، g، هو الذي سوف تقوم بالتبديل أكثر. بدونه، JavaScript'؛s replace التغييرات فقط أولاً تطابق واترك بقية النص بمفرده - وهذا هو المعيار String.replace السلوك والمفاجأة للأشخاص الذين يتوقعون استبدال الجميع. دور g يتم إعادة كتابة كل تطابق في النص. يتم تشغيل الأداة افتراضيًا، لأن استبدال كل شيء هو ما يعنيه الأشخاص تسعة عشر مرة من أصل عشرين، ولكن التبديل موجود للأوقات التي تريد حقًا لمسها لأول مرة فقط. علامة حالة التجاهل، i، يجعل النمط متطابقًا بغض النظر عن حالة الحرف، لذا error مباريات أيضا Error و ERROR - ضروري عندما تقوم بتطبيع مستويات السجل أو ترتيب الكتابة بالأحرف الكبيرة غير المتسقة.
العلم متعدد الخطوط، m، يغير ما المراسي ^ و $ يعني: مع ذلك، فإنها تتطابق مع بداية ونهاية كل منهما خط بدلاً من النص بأكمله، وهو ما تريده عندما تقوم بتجريد مسافة بيضاء زائدة أو بادئة كل سطر. علامة dotAll، s، يتيح للنقطة مطابقة أحرف السطر الجديد، بحيث يمكن للنمط أن يمتد فواصل الأسطر - وهو مفيد لإعادة كتابة الكتل متعددة الأسطر. ال u (يونيكود) و y العلامات (اللزجة) مخصصة للحالات المتقدمة: u يتيح التعامل الصحيح مع الشخصيات خارج المستوى الأساسي وبعض أشكال الهروب، و y يثبت كل محاولة مطابقة في الموضع المحدد بعد الموضع السابق. يلخص جدول المقارنة أدناه متى يحصل كل واحد على مكانه.
| علم | رسالة | التأثير على الاستبدال | الاستخدام النموذجي |
|---|---|---|---|
| عالمي | g |
استبدل كل مباراة بدلاً من الأولى فقط | تقريبا كل استبدال الكل |
| تجاهل الحالة | i |
تطابق بغض النظر عن حالة الرسالة | تطبيع مستويات السجل، وترتيب الكتابة بالأحرف الكبيرة |
| متعدد الخطوط | m |
^ و $ مرساة لكل سطر |
بادئة الخطوط، وتجريد المسافات الزائدة |
| دوتال | s |
النقطة تتطابق مع الأسطر الجديدة أيضًا | إعادة كتابة الكتل متعددة الأسطر |
| يونيكود | u |
التعامل الصحيح مع الشخصيات النجمية و \u{...} |
الرموز التعبيرية، النصوص غير اللاتينية |
| لزجة | y |
تطابق فقط في الوضع الحالي | الرموز، التحليل المتسلسل الصارم |
متى يجب أن أستخدم استبدال regex بدلاً من البحث والاستبدال البسيط؟
الخط الفاصل بسيط: استخدم البحث والاستبدال البسيط عندما تعرف النص الدقيق، ثم قم بالوصول إلى استبدال regex عندما تعرف الشكل ولكن ليس النص الدقيق. إذا كنت تغير كل 2023 إلى 2024، الاستبدال العادي أسرع وأكثر أمانا. إذا كنت تتغير كل سنة مكونة من أربعة أرقام بغض النظر عن القيمة، فإن النمط فقط هو الذي يمكنه التعبير عن ذلك.
تقع ثلاث عائلات من المهام بشكل واضح على الجانب الحقيقي. الأول هو إعادة التنسيق، حيث يظل المحتوى كما هو ولكن يتغير ترتيبه - التواريخ وأرقام الهواتف والأسماء المكتوبة وحاصل الاقتباس؛ الأخير والأول وحاصل الاقتباس؛ الذي تريده كـ "؛ الأول والأخير."؛ التقاط المجموعات بالإضافة إلى مقبض بديل مُعاد ترتيبه، كل هذه. الثاني هو تجريد بالجملة، حيث تقوم بحذف كل شيء مطابق للنمط - العلامات والتعليقات وأحرف التحكم والمسافات البيضاء الإضافية - عن طريق الاستبدال بلا شيء. والثالث هو التحرير المشروط على نطاق واسع، حيث تقوم بتغليف أو بادئة أو إضافة تعليق توضيحي لكل تكرار للنمط، باستخدام $& للحفاظ على المطابقة والإضافة إليها. عندما يحتوي التحويل الذي تصفه لنفسك على الكلمة "؛ كل "؛ متبوعًا بوصف بدلاً من سلسلة حرفية، فأنت في منطقة استبدال regex.
هناك أيضًا وسيطة سير العمل. يؤدي إجراء هذه التعديلات في محرر التعليمات البرمجية الخاص بك '؛s إلى البحث عن الملف واستبداله، ولكنه يقوم بتحرير الملف في مكانه، مما يعني أن الخطأ هو خطأ في ملفك الحقيقي. يتيح لك تشغيل التحويل في أداة الخدش أولاً رؤية المخرجات وعدد البدائل قبل ارتكاب أي شيء، ثم لصق النتيجة التي تم التحقق منها مرة أخرى. لأن استبدال ريجكس تعمل الأداة بالكامل في متصفحك ولا تقوم أبدًا بتحميل ما تقوم بلصقه، ومن الآمن استخدامها حتى عندما يكون النص عبارة عن سجل إنتاج أو تصدير عميل - وهي نقطة أشير إليها بالكامل في دليل خصوصية البيانات للأدوات عبر الإنترنت.
ما هي الأخطاء الشائعة مع استبدال regex؟
الأكثر شيوعًا هو نسيان العلم العالمي والتساؤل عن سبب تغيير المباراة الأولى فقط. إذا بدا أن بديلك لم يفعل شيئًا تقريبًا - تعديل واحد حيث توقعت العشرات - فتحقق من ذلك g قيد التشغيل. إنها رحلة شائعة لدرجة أن الأداة تقوم بتشغيلها افتراضيًا، ولكن في اللحظة التي تقوم فيها بإيقاف تشغيلها لاستهداف مباراة واحدة، تذكر إعادتها مرة أخرى.
والثاني حرفي $1 الظهور في الإخراج حيث توقعت النص الذي تم التقاطه. وهذا يعني دائمًا أن المجموعة التي تشير إليها غير موجودة - لا يحتوي النمط الخاص بك على مجموعة أولى من الأقواس، لذلك لا يوجد شيء له $1 للوقوف، ويترك المحرك الرمز المميز كما هو. الحل هو لف الجزء الذي تريد إعادة استخدامه بين قوسين لإنشاء المجموعة، وحساب المجموعات من اليسار بدءًا من مجموعة واحدة. هناك فخ ذو صلة يخطئ في الحساب عندما يكون النمط الخاص بك متداخلًا أو مجموعات اختيارية؛ عندما يصبح الترقيم مربكًا، قم بالتبديل إلى المجموعات المسماة بحيث يكون المرجع لا لبس فيه.
الخطأ الثالث هو النمط الذي يطابق أكثر مما كنت تقصد، عادة لأن المحدد الكمي جشع. نمط مثل <.+> من المفترض أن تتطابق علامة HTML واحدة، وسوف تتطابق بسعادة من الأولى < الى أخير > على الخط، ابتلاع كل شيء بين علامتين. العلاج هو محدد كمي غير جشع، <.+?>، أو فئة أحرف أكثر دقة، <[^>]+>. هذا هو بالضبط الوضع الذي تتحقق فيه من النمط الموجود في اختبار regex أولاً، شاهد ما يسلط الضوء عليه، وبعد ذلك فقط قم بتشغيل البديل - وهي العادة دليل اختبار Regex يمشي بالتفصيل. عدد البدائل الموضح في الأداة هو ضمانك الآخر: إذا أبلغت عن عمليات استبدال أكثر أو أقل بكثير من عدد الأشياء التي كنت تنوي تغييرها، فإن النمط خاطئ، وليس الأداة.
مثال عملي: إعادة تنسيق الأسماء وتجريد الضوضاء
اسمحوا لي أن أتناول مهمة صغيرة من البداية إلى النهاية، لأن رؤية القطع تعمل معًا تعمل على إصلاح الفكرة بشكل أفضل من أي قاعدة واحدة. لنفترض أن لديك قائمة جهات الاتصال المصدرة كـ Doe, Jane و Smith, John، واحد في كل سطر، وتريدهم كما Jane Doe و John Smith.
شكل كل سطر هو: بعض أحرف الكلمات، فاصلة، مسافة، ثم المزيد من أحرف الكلمات. كنمط هو (\w+), (\w+)، مع اللقب الذي تم التقاطه في المجموعة الأولى والاسم الأول في المجموعة الثانية. البديل الذي يتبادلهم ويسقط الفاصلة هو $2 $1 - المجموعة الثانية، مسافة، المجموعة الأولى. لصق القائمة في استبدال ريجكس الأداة، أدخل هذا النمط واستبدل، واترك العلامة العامة قيد التشغيل، وينقلب كل سطر إلى "؛ أول أخير واقتباس؛ في وقت واحد. يخبرك عدد الاستبدال بعدد الأسطر التي تم لمسها، والتي يمكنك التحقق من صحتها مقابل عدد جهات الاتصال.
لنفترض الآن أن نفس التصدير يحتوي على مسافة بيضاء زائدة في بعض الأسطر التي تريد أيضًا إزالتها. هذا هو البديل الثاني المنفصل: النمط +$ مع العلم متعدد الخطوط على ذلك $ يطابق نهاية كل سطر، واستبدال فارغ بحيث يتم حذف المسافات المتطابقة بدلاً من استبدالها. قم بتشغيله بعد تبديل الاسم ويكون الملف نظيفًا. يعد أسلوب التمرير المزدوج - بديل واحد لإعادة الهيكلة، وواحد للتجريد - نموذجيًا، ولأن كل تمريرة تظهر لك مخرجاتها ويتم حسابها قبل نسخها، فإنك لا تخمن أبدًا ما إذا كان التحويل قد فعل ما تقصده. عندما يحتاج النص المعاد تشكيله إلى فرق مرئي نهائي مقابل النص الأصلي لتأكيد عدم نقل أي شيء آخر، قم بلصق كلا الإصدارين في فرق النص أداة. بالنسبة للمجموعة الأوسع من الأدوات المساعدة اليومية، فإن هذا يناسب مجموعة أدوات مطور الويب يجمع تلك التي أصل إليها بالنسبة لمعظم.
الأسئلة الشائعة
كيف يمكنني العثور على تعبير عادي عبر الإنترنت واستبداله؟ أدخل النمط الخاص بك في حقل البحث بدون خطوط مائلة، واكتب البديل في حقل الاستبدال، واختر العلامات الخاصة بك، والصق النص الخاص بك. يظهر الإخراج المعاد كتابته على الفور ويظهر عدد عمليات الاستبدال التي تم تشغيلها. كل شيء يحدث في متصفحك، لذلك لا يتم تحميل أي شيء.
كيف تعمل المراجع الخلفية لمجموعة الالتقاط في الاستبدال؟
تقوم الأقواس في النمط الخاص بك بإنشاء مجموعات مرقمة، ويمكنك إعادة استخدامها في الاستبدال بـ $1 و$2 وما إلى ذلك. على سبيل المثال، النمط (\d{4})-(\d{2})-(\d{2}) مع الاستبدال $3/$2/$1 يحول 2024-01-15 إلى 15/01/2024. المجموعات المسماة مثل (؟
كيف يمكنني استبدال جميع المباريات بدلاً من الأولى فقط؟ تمكين علامة g (العالمية). بدونها، يستبدل JavaScript المطابقة الأولى فقط، تمامًا كما تتصرف طريقة String.replace. مع تمكين g، يتم استبدال كل تطابق في النص، وهو ما تحتاجه معظم المهام البديلة.
كيف يمكنني حذف كل مباراة بدلاً من استبدالها؟ اترك حقل الاستبدال فارغًا. مع وضع العلامة العامة، تتم إزالة كل تطابق من النص. هذه هي أنظف طريقة لتجريد العلامات أو تشغيل المسافات البيضاء أو الأحرف غير المرغوب فيها التي تشترك في النمط.
ماذا تعني الرموز المميزة $&؛، الخلفية، والفاصلة العليا في الاستبدال؟ $&؛ يُدرج السلسلة الفرعية المتطابقة بالكامل، وتُدرج علامة الظهر النص قبل المطابقة، وتُدرج الفاصلة العليا النص بعده. لإخراج علامة الدولار الحرفية، اكتب $$. تتبع هذه أنماط الاستبدال الخاصة القياسية لسلسلة JavaScript.
ما هي نكهة regex التي تستخدمها هذه الأداة؟ ويستخدم محرك JavaScript (ECMAScript) RegExp المدمج في متصفحك، وهو مطابق للمحرك الموجود في Node.js. تتطابق النتائج هنا مع كيفية تصرف نفس النمط والاستبدال في JavaScript وTypeScript. يختلف JavaScript regex عن PCRE وPython re وJava في بعض الميزات المتقدمة.
لماذا ينتج بديلي دولارًا واحدًا حرفيًا بدلاً من النص الذي تم التقاطه؟ عادةً ما يعني $1 الحرفي في الإخراج أن النمط الخاص بك لا يحتوي على مجموعة التقاط أولى، لذلك لا يوجد شيء يمكن الرجوع إليه بـ $1. قم بلف الجزء الذي تريد إعادة استخدامه بين قوسين لإنشاء المجموعة، واحسب المجموعات من اليسار إلى اليمين بدءًا من 1.
هل من الآمن تشغيل استبدال regex على البيانات الحساسة؟ نعم. تتم جميع عمليات المطابقة والاستبدال في JavaScript داخل متصفحك، لذلك لا يتم إرسال أي نمط أو استبدال أو نص إلى أي خادم، ولا يتم تسجيل أي شيء، وتعمل الأداة مع تعطيل اتصالك. يمكنك إعادة تنسيق ملفات السجل أو البيانات الشخصية أو التنسيقات الخاصة بأمان.
هذا الدليل يرافق مجانا استبدال ريجكس أداة على Toolz.dev - لا يوجد تسجيل ولا تحميلات، تعمل دون اتصال بالإنترنت.



