جافاسكريبت - كيف يمكن استبدال المجموعات التي تم التقاطها فقط؟
لدي كود HTML قبل وبعد النص:
name="some_text_0_some_text"
أود استبدال 0 بشيء مثل: !NEW_ID!
لذلك صنعت تعبيرًا نمطيًا بسيطًا :
.*name="\w+(\d+)\w+".*
لكن لا أرى كيف يمكن استبدال الكتلة الملتقطة فقط.
هل هناك طريقة لاستبدال نتيجة ملتقطة مثل ($1) بسلسلة أخرى؟
النتيجة ستكون:
name="some_text_!NEW_ID!_some_text"
الإجابة رقم 1
الحل هو إضافة لقطات للنص السابق واللاحق:
str.replace(/(.*name="\w+)(\d+)(\w+".*)/, "$1!NEW_ID!$3")
شرح
تُستخدم الأقواس لإنشاء "مجموعات"، التي يتم بعد ذلك تعيين فهرس لها يبدأ من 1، ويمكن الوصول إليه في الاستبدال باستخدام $.
- الكلمة الأولى
(\w+)موجودة في مجموعة، وتصبح$1 - الجزء الأوسط
(\d+)هو المجموعة الثانية (ولكن يتم تجاهله في الاستبدال) - المجموعة الثالثة
(\w+".*)تصبح$3
لذلك عندما تقوم بإعطاء سلسلة الاستبدال "$1!new_ID!$3"، يتم استبدال $1 و $3 تلقائيًا بالمجموعة الأولى والمجموعة الثالثة، مما يسمح باستبدال المجموعة الثانية بالسلسلة الجديدة، مع الحفاظ على النص المحيط بها.
الإجابة رقم 2
الآن بعد أن أصبح لدى Javascript دعم للبحث المتراجع (Lookbehind) اعتبارًا من ES2018، في البيئات الأحدث، يمكنك تجنب المجموعات تمامًا في مواقف مثل هذه. بدلاً من ذلك، استخدم البحث المتراجع لما يأتي قبل المجموعة التي كنت تلتقطها، واستخدم البحث الأمامي لما يأتي بعد، واستبدل بـ فقط !NEW_ID!:
const str = 'name="some_text_0_some_text"';
console.log(
str.replace(/(?<=name="\w+)\d+(?=\w+")/, '!NEW_ID!')
);بهذه الطريقة، التطابق الكامل هو فقط الجزء الذي يحتاج إلى الاستبدال.
(?<=name="\w+)- البحث للأمام عنname="، متبوعًا بحروف الكلمة (لحسن الحظ، لا يجب أن تكون الأطوال في البحث للأمام ثابتة في جافاسكريبت!)\d+- تطابق رقمًا واحدًا أو أكثر - القسم الوحيد من النمط الذي ليس في نظرة حولية، وهو الجزء الوحيد من السلسلة الذي سيكون في المطابقة الناتجة(?=\w+")- توقع للأحرف الكلمة يتبعها"`
ضع في اعتبارك أن النظر للخلف جديد إلى حد ما. يعمل في الإصدارات الحديثة من V8 (بما في ذلك Chrome وOpera وNode)، لكنه لا يعمل في معظم البيئات الأخرى، على الأقل ليس بعد. لذلك، بينما يمكنك استخدام النظر للخلف بشكل موثوق في Node وفي متصفحك الخاص (إذا كان يعمل على إصدار حديث من V8)، إلا أنه لم يحظَ بعد بدعم كافٍ من العملاء العشوائيين (مثلما على موقع ويب عام).
