قوة التعابير النمطية (RegEx) مع دالة replace() في JavaScript: دليل شامل

دقائق القراءة: 4

تُعد التعابير النمطية (Regular Expressions)، التي تُعرف اختصارًا بـ RegEx أو RegExp، أداة قوية لتحليل النصوص ومعالجتها في عالم البرمجة. باستخدام RegEx، يمكنك مطابقة سلاسل نصية عند نقاط تتوافق مع أحرف محددة (مثل JavaScript) أو أنماط معقدة (مثل NumberStringSymbol - 3a&).

في JavaScript، تُستخدم دالة replace() على السلاسل النصية لاستبدال أجزاء منها بأحرف أو سلاسل أخرى. غالبًا ما تُستخدم هذه الدالة على النحو التالي:

فهم دالة replace() الأساسية

تُستخدم دالة replace() عادةً بالشكل التالي:

const str = 'JavaScript';
const newStr = str.replace("ava", "-");
console.log(newStr); // J-Script

كما يتضح أعلاه، تقبل دالة replace() وسيطين: السلسلة المراد استبدالها، والسلسلة التي ستحل محلها. استخدام دالة replace() بالطريقة المذكورة أعلاه محدود؛ فالحروف المراد استبدالها معروفة ومحددة (في المثال السابق: "ava"). ولكن ماذا لو كنا مهتمين بنمط معين بدلاً من ذلك؟ ربما رقم، حرفان، وكلمة "foo"، أو ثلاثة رموز مستخدمة معًا؟

لماذا نحتاج التعابير النمطية (RegEx) مع replace()؟

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

كيفية استخدام التعابير النمطية (RegEx) مع دالة replace() في JavaScript

لاستخدام RegEx، سيتم استبدال الوسيط الأول لدالة replace() ببنية RegEx، على سبيل المثال /نمط_هنا/. تعمل هذه البنية كنمط، حيث سيتم استبدال أي أجزاء من السلسلة النصية تطابقه بالسلسلة الفرعية الجديدة.

مثال عملي: استبدال الأنماط المعقدة

لنأخذ هذا المثال:

// يطابق رقمًا، بعض الأحرف، ورقمًا آخر
const reg = /\d.*\d/;
const str = "Java3foobar4Script";
const newStr = str.replace(reg, "-");
console.log(newStr); // "Java-Script"

في هذا المثال، السلسلة 3foobar4 تطابق التعبير النمطي /\d.*\d/ (الذي يطابق رقمًا \d متبوعًا بأي عدد من الأحرف .* ثم رقمًا آخر \d)، لذا تم استبدالها بالرمز -.

التحكم في الاستبدال: العلامات (Flags) في RegEx

ماذا لو أردنا إجراء عمليات استبدال في أماكن متعددة؟ توفر RegEx ذلك بالفعل باستخدام العلامة g (اختصار لـ global)، ويمكن استخدامها بنفس الطريقة مع دالة replace().

العلامة g (Global): الاستبدال الشامل

تسمح العلامة g باستبدال جميع التطابقات في السلسلة، وليس فقط أول تطابق:

const reg = /\d{3}/g;
const str = "Java323Scr995ip4894545t";
const newStr = str.replace(reg, "");
console.log(newStr); // JavaScrip5t
// الرقم 5 لم يجتز الاختبار :(

يطابق التعبير النمطي /\d{3}/g أجزاء السلسلة التي تتكون من 3 أرقام متتالية بالضبط. تطابق 323 و995 و489 و454 هذا النمط. لكن الرقم 5 الأخير لا يطابق النمط لأنه ليس جزءًا من ثلاثة أرقام متتالية. النتيجة هي أن JavaScrip5t يوضح كيف تمت مطابقة الأنماط بشكل صحيح واستبدالها بالسلسلة الفرعية الجديدة (سلسلة فارغة).

العلامة i (Case-Insensitive): تجاهل حالة الأحرف

يمكن أيضًا استخدام علامة حالة الأحرف i (اختصار لـ case-insensitive). هذا يعني أنه يمكنك استبدال الأنماط بغض النظر عن حالة الأحرف:

const reg1 = /\dA/;
const reg2 = /\dA/i;
const str = "Jav5ascript";
const newStr1 = str.replace(reg1, "--");
const newStr2 = str.replace(reg2, "--");
console.log(newStr1); // Jav5ascript
console.log(newStr2); // Jav--script

في المثال أعلاه، السلسلة ..5a.. لا تطابق البنية الأولى reg1 لأن RegEx حساسة لحالة الأحرف افتراضيًا، والحرف a هنا صغير. ولكن مع استخدام العلامة i في البنية الثانية reg2، يتم تجاهل حالة الأحرف ويتم استبدال السلسلة كما هو متوقع.

استخدام التعابير النمطية (RegEx) مع دالة split()

تستخدم دالة split() أيضًا RegEx. مما يعني أنه يمكنك تقسيم سلسلة نصية ليس فقط عند السلاسل الفرعية التي تطابق أحرفًا محددة، ولكن أيضًا عند الأنماط.

تقسيم النصوص بناءً على الأنماط

إليك نظرة سريعة:

const regex = /\d{2}a/;
const str = "Hello54 How 64aare you";
console.log(str.split(regex)); // ["Hello54 How ", "are you"]

في هذا المثال، تم تقسيم السلسلة عند 64a لأن هذه السلسلة الفرعية تطابق التعبير النمطي المحدد /\d{2}a/ (رقمان متبوعان بالحرف a). لاحظ أن العلامة الشاملة g في دالة split() غير ذات صلة، على عكس العلامة i والعلامات الأخرى. هذا لأن split() تقسم السلسلة عند النقاط المتعددة التي يطابقها التعبير النمطي بشكل طبيعي دون الحاجة إلى العلامة g.

الخلاصة التقنية

تُعزز RegEx من فعالية وقوة ومتعة استبدال وتقسيم السلاسل النصية في JavaScript. لم تعد مقيدًا بالأحرف الدقيقة فحسب، بل بالأنماط المعقدة وعمليات الاستبدال المتعددة في آن واحد. في هذا المقال، استعرضنا كيفية عملهما معًا باستخدام أمثلة متعددة، بما في ذلك العلامات المهمة مثل g وi. إن إتقان RegEx يفتح آفاقًا جديدة لمعالجة النصوص بشكل ديناميكي ومرن، مما يجعلها مهارة لا غنى عنها لأي مطور JavaScript يسعى لتحسين كفاءة معالجة البيانات النصية في تطبيقاته.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *