جدول المحتويات
في هذا البرنامج التعليمي ، سنلقي نظرة متعمقة على كيفية استخدام regex لمطابقة السلاسل في Excel.
عندما تحتاج إلى العثور على قيمة معينة في نطاق من الخلايا ، يمكنك استخدام وظيفة MATCH أو XMATCH. عند البحث عن سلسلة محددة في خلية ، تصبح الدالتان FIND و SEARCH في متناول اليد. وكيف يمكنك معرفة ما إذا كانت الخلية تحتوي على معلومات تطابق نمطًا معينًا؟ من الواضح ، باستخدام التعبيرات النمطية. ولكن من خارج منطقة الجزاء ، فإن Excel لا يدعم regexes! لا تقلق ، سنجبرها على :)
وظيفة Excel VBA Regex لمطابقة السلاسل
كما هو واضح من العنوان ، من أجل استخدام التعبيرات العادية في Excel ، تحتاج إلى إنشاء وظيفتك الخاصة. لحسن الحظ ، يحتوي VBA في Excel على كائن RegExp يحمل في ثناياه عوامل ، والذي يمكنك استخدامه في التعليمات البرمجية كما هو موضح أدناه:
Public Function RegExpMatch (input_range As Range ، pattern As String ، Optional match_case As Boolean = True) As متغير Dim arRes () بصفته صفيف متغير لتخزين النتائج Dim iInputCurRow، iInputCurCol، cntInputRows، cntInputCols As Long فهرس الصف الحالي في نطاق المصدر ، فهرس العمود الحالي في نطاق المصدر ، عدد الصفوف ، عدد أعمدة في خطأ GoTo ErrHandl RegExpMatch = arRes تعيين regex = CreateObject ("VBScript.RegExp") regex.pattern = نمط regex.Global = True regex.MultiLine = True If True = match_case ثم regex.ignorecase = False Else regex.ignorecase = True نهايةالتعبيرات.النمط : \ b [\ w \. \ -] + @ [A-Za-z0-9] + [A-Za-z0-9 \. \ - ] * [A-Za-z0-9] + \. [A-Za-z] {2،24} \ b
لفهم ما يحدث هنا بشكل أفضل ، دعنا نلقي نظرة فاحصة على كل جزء :
- اسم المستخدم قد يتضمن أحرفًا وأرقامًا وشرطات سفلية ونقاط وواصلات. مع الأخذ في الاعتبار أن \ w يتطابق مع أي حرف أو رقم أو شرطة سفلية ، نحصل على التعبير العادي التالي: [\ w \. \ -] +
- اسم المجال قد يتضمن أحرفًا كبيرة وصغيرة ، الأرقام والواصلات (ولكن ليس في الموضع الأول أو الأخير) والنقاط (في حالة المجالات الفرعية). نظرًا لأن الشرطة السفلية غير مسموح بها ، فبدلاً من \ w ، نستخدم 3 مجموعات أحرف مختلفة: [A-Za-z0-9] + [A-Za-z0-9 \. \ -] * [A-Za-z0-9 ] +
- نطاق المستوى الأعلى يتكون من نقطة متبوعة بأحرف كبيرة وصغيرة. يمكن أن يحتوي على من 2 إلى 24 حرفًا (أطول نطاق TLD موجود حاليًا): \. [A-Za-z] {2،24}
ملاحظة. يفترض النمط أن اسم المجال يحتوي على 2 أو أكثر من الأحرف الأبجدية الرقمية.
مع النص الأصلي في A5 والنمط الموجود في A5 ، تأخذ الصيغة هذا الشكل:
=RegExpMatch(A5, $A$2)
أو يمكنك استخدام صيغة عادية أبسط تعبير للتحقق من صحة البريد الإلكتروني باستخدام مجموعة أحرف صغيرة أو كبيرة:
نمط : \ b [\ w \. \ -] + @ [a-z0-9] + [a- z0-9 \. \ -] * [a-z0-9] + \. [a-z] {2،24} \ b
لكن اجعل صيغتك غير حساسة لحالة الأحرف:
=RegExpMatch(A5, $A$2, FALSE)
صيغة Excel IF مع مطابقة التعبير العادي
نظرًا لحقيقة أن يحمل في ثناياه عوامل ومخصصتسير الدالات بشكل جيد ، فلا يوجد ما يمنعك من استخدامها معًا في صيغة واحدة.
لإرجاع شيء ما أو حسابه في حالة مطابقة تعبير عادي وشيء آخر إذا لم يكن مطابقًا ، قم بتضمين RegExpMatch المخصص تعمل في النص المنطقي لـ IF:
IF (RegExpMatch (...)، [value_if_true]، [value_if_false])على سبيل المثال ، إذا كانت السلسلة في A5 تحتوي على عنوان بريد إلكتروني صالح ، فيمكنك إرجاع "نعم" ؛ وإلا "لا".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
عد إذا تم مطابقة التعبير العادي
نظرًا لأن دالات Excel الأصلية لا تدعم التعبيرات العادية ، لا يمكن وضع regex مباشرة في وظيفة COUNTIS أو COUNTIFS. لحسن الحظ ، يمكنك محاكاة هذه الوظيفة باستخدام وظيفتنا المخصصة.
لنفترض أنك استخدمت regex لمطابقة أرقام الهواتف وإخراج النتائج في العمود B. لمعرفة عدد الخلايا التي تحتوي على أرقام هواتف ، ما عليك سوى لحساب القيم الحقيقية في B5: B9. ويمكن القيام بذلك بسهولة باستخدام صيغة COUNTIF القياسية:
=COUNTIF(B5:B9, TRUE)
لا تريد أي أعمدة إضافية في ورقة العمل الخاصة بك؟ لا مشكلة. مع الأخذ في الاعتبار أن وظيفتنا المخصصة يمكنها معالجة خلايا متعددة في وقت واحد وأن SUM في Excel يمكن أن يضيف قيمًا في مصفوفة ، فإليك ما تفعله:
- توفير مرجع نطاق إلى RegExpMatch ، لذلك يقوم بإرجاع مصفوفة من قيم TRUE و FALSE.
- استخدم نفي مزدوج (-) لإجبار القيم المنطقية على القيم المنطقية والأصفار.
- احصل على الدالة SUM لإضافة ما يصل إلى 1 و 0 في المصفوفة الناتجة.
=SUM(--RegExpMatch(A5:A9, $A$2))
تطابق Regex مع Ultimate Suite
يمكن لمستخدمي Ultimate Suite الاستفادة من أربع وظائف Regex القوية دون إضافة أي كود VBA إلى مصنفاتهم حيث يتم دمجها بسلاسة في Excel أثناء تثبيت الوظيفة الإضافية. تتم معالجة وظائفنا المخصصة بواسطة محرك .NET RegEx القياسي ودعم التعبيرات العادية الكلاسيكية كاملة الميزات.
كيفية استخدام وظيفة RegexMatch المخصصة
بافتراض أن لديك أحدث إصدار من Ultimate Suite مثبتًا ( 2021.4 أو أحدث) ، يمكنك إنشاء صيغة Regex Match في خطوتين بسيطتين:
- في علامة التبويب Ablebits Data في علامة التبويب Text ، انقر فوق أدوات Regex .
- حدد سلاسل المصدر.
- أدخل النمط الخاص بك.
- اختر الخيار تطابق .
- للحصول على النتائج كصيغ ، وليس قيم ، حدد إدراج كصيغة خانة الاختيار.
- انقر فوق الزر تطابق .
بعد لحظة ، يتم إدراج الوظيفة AblebitsRegexMatch في عمود جديد على يمين البيانات.
في لقطة الشاشة أدناه ، تتحقق الوظيفة مما إذا كانت السلاسل في العمود A تحتوي على 7 أرقام أرقام أم لا.
نصائح:
- الوظيفة يمكن إدراجها مباشرة في خلية عبر مربع الحوار القياسي إدراج دالة ، حيث يتم تصنيفها ضمن AblebitsUDFs .
- بشكل افتراضي ، يتم إضافة تعبير عادي إلى الصيغة ، ولكن يمكنك أيضًا الاحتفاظ في خلية منفصلة. لهذا ، ما عليك سوى استخدام مرجع خلية للوسيطة الثانية.
- بشكل افتراضي ، تكون الوظيفة حساسة لحالة الأحرف . للمطابقة غير الحساسة لحالة الأحرف ، استخدم النمط (؟ i).
لمزيد من المعلومات ، يرجى الاطلاع على وظيفة AblebitsRegexMatch.
هذه هي كيفية إجراء مطابقة التعبير العادي في Excel. أشكرك على القراءة وأتطلع إلى رؤيتك على مدونتنا الأسبوع المقبل!
التنزيلات المتاحة
أمثلة Excel Regex Match (ملف .xlsm)
Ultimate Suite 14- إصدار يوم كامل الوظائف (ملف. exe)
If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes (1 To cntInputRows، 1 To cntInputCols) لـ iInputCurRow = 1 To cntInputRows لـ iInputCurCol = 1 إلى arntInputCols .Cells (iInputCurRow، iInputCurCol) .Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr (xlErrValue) End Functionالصق الكود في محرر VBA ، وستكون الوظيفة الجديدة RegExpMatch جاهز للاستخدام. إذا لم تكن خبيرًا جدًا في VBA ، فقد يكون هذا الدليل مفيدًا: كيفية إدراج رمز VBA في Excel.
ملاحظة. بعد إدخال الرمز ، تذكر حفظ الملف كمصنف ممكن بماكرو (.xlsm).
بناء جملة RegExpMatch
تتحقق الوظيفة RegExpMatch مما إذا كان أي جزء من سلسلة المصدر يطابق تعبيرًا عاديًا. والنتيجة هي قيمة منطقية: TRUE إذا تم العثور على تطابق واحد على الأقل ، وإلا فالخطأ. ، pattern، [match_case])
حيث:
- نص (مطلوب) - سلسلة واحدة أو أكثر للبحث فيها. يمكن توفيرها كخلية أو مرجع نطاق.
- النمط (مطلوب) - التعبير العادي المراد مطابقته. عندما توضع مباشرة في صيغة ، يجب أن يكون النمط محاطًا بعلامات اقتباس مزدوجة.
- Match_case (اختياري) - يحدد التطابقيكتب. إذا كانت القيمة TRUE أو تم حذفها (افتراضيًا) ، فسيتم إجراء المطابقة الحساسة لحالة الأحرف ؛ if FALSE - غير حساس لحالة الأحرف.
تعمل الوظيفة في جميع إصدارات Excel 365 و Excel 2021 و Excel 2019 و Excel 2016 و Excel 2013 و Excel 2010.
3 أشياء أنت يجب أن تعرف عن RegExpMatch
قبل أن نصل إلى الحسابات العملية ، يرجى ملاحظة النقاط التالية التي توضح بعض الجوانب الفنية:
- يمكن للوظيفة معالجة خلية واحدة أو نطاق الخلايا . في الحالة الأخيرة ، يتم إرجاع النتائج في الخلايا المجاورة في شكل صفيف ديناميكي ، أو نطاق انسكاب ، كما هو موضح في هذا المثال.
- افتراضيًا ، تكون الوظيفة حساسة لحالة الأحرف . لتجاهل حالة النص ، اضبط الوسيطة match_case على FALSE. نظرًا لقيود VBA Regexp ، فإن النمط غير المتحسس لحالة الأحرف (؟ i) غير مدعوم.
- إذا لم يتم العثور على نمط صالح ، ترجع الدالة FALSE ؛ إذا كان النمط غير صالح ، فإن الخطأ #VALUE! حدث خطأ.
أدناه ، ستجد بعض أمثلة مطابقة التعبير العادي التي تم إنشاؤها لأغراض توضيحية. لا يمكننا أن نضمن أن أنماطنا ستعمل بلا أخطاء مع نطاق أوسع من بيانات الإدخال في أوراق العمل الحقيقية الخاصة بك. قبل البدء في الإنتاج ، تأكد من اختبار أنماط العينات وضبطها وفقًا لاحتياجاتك.
كيفية استخدام regex لمطابقة السلاسل في Excel
عندما تحتوي جميع السلاسل التي تريد مطابقتها على نفس النمط،تعتبر التعبيرات العادية حلاً مثاليًا.
لنفترض أن لديك نطاقًا من الخلايا (A5: A9) يحتوي على تفاصيل مختلفة حول بعض العناصر. تريد معرفة الخلايا التي تحتوي على وحدات SKU. بافتراض أن كل SKU يتكون من حرفين كبيرين وواصلة و 3 أرقام ، يمكنك مطابقتهم باستخدام التعبير التالي.
النمط : \ b [A-Z] {2} - \ د {3} \ b
حيث [A-Z] {2} يعني أي حرفين كبيرين من A إلى Z و \ d {3} يعني أي 3 أرقام من 0 إلى 9. يشير الحرف \ b إلى كلمة الحدود ، بمعنى أن SKU هي كلمة منفصلة ، وليست جزءًا من سلسلة أكبر مثل 23-MAR-2022.
مع إنشاء النمط ، يمكننا الانتقال إلى كتابة صيغة. بشكل أساسي ، لا يختلف استخدام وظيفة مخصصة عن الوظيفة الأصلية. بمجرد أن تبدأ في كتابة الصيغة ، سيظهر اسم الوظيفة في القائمة المقترحة بواسطة الإكمال التلقائي لبرنامج Excel. ومع ذلك ، هناك بعض الفروق الدقيقة في Dynamic Array Excel (Microsoft 365 و Excel 2021) و Excel التقليدي (2019 والإصدارات الأقدم).
تطابق سلسلة في خلية واحدة
لمطابقة سلسلة في خلية واحدة ، قم بالإشارة إلى تلك الخلية في الوسيطة الأولى. من المفترض أن تحتوي الوسيطة الثانية على تعبير عادي.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
يمكن أيضًا الاحتفاظ بالنمط في خلية محددة مسبقًا ، والتي يتم تأمينها بمرجع مطلق ($ A $ 2):
=RegExpMatch(A5, $A$2)
بعد إدخال الصيغة في الخلية الأولى ، يمكنك سحبها لأسفل إلى جميع الصفوف الأخرى.
هذه الطريقةيعمل بشكل جميل في جميع إصدارات Excel .
قم بمطابقة السلاسل في خلايا متعددة في وقت واحد
لمطابقة سلاسل متعددة مع صيغة واحدة ، قم بتضمين مرجع نطاق في الوسيطة الأولى:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
في Excel 365 و Excel 2021 التي تدعم المصفوفات الديناميكية ، تعمل بهذه الطريقة - اكتب الصيغة في الخلية الأولى ، واضغط على Enter ، وستنتشر الصيغة تلقائيًا في الخلايا أدناه.
في Excel 2019 وما قبله ، يعمل فقط كصيغة مصفوفة تقليدية لمحرك البحث المخصص ، والتي يتم إدخالها في نطاق من الخلايا وإكمالها بالضغط على مفتاحي Ctrl + Shift + Enter معًا.
Regex لمطابقة الرقم
لمطابقة أي رقم فردي من 0 إلى 9 ، استخدم الحرف \ d في regex. اعتمادًا على مهمتك الخاصة ، أضف مُحدِّدًا كميًا مناسبًا أو أنشئ نمطًا أكثر تعقيدًا.
Regex لمطابقة أي رقم
لمطابقة أي رقم بأي طول ، ضع المُحدِّد الكمي + مباشرة بعد / حرف d ، والذي يشير إلى البحث عن الأرقام التي تحتوي على رقم واحد أو أكثر.
النمط : \ d +
=RegExpMatch(A5:A9, "\d+")
Regex لمطابقة عدد الطول المحدد
إذا كان هدفك هو مطابقة القيم الرقمية التي تحتوي على عدد معين من الأرقام ، فاستخدم \ d مع مُحدد كمي مناسب.
على سبيل المثال ، لمطابقة أرقام الفواتير المكونة من 7 أرقام بالضبط ، يمكنك استخدام \ d {7}. ومع ذلك ، يرجى أن تضع في اعتبارك أنها ستتطابق مع 7كما هو متوقع:
ملاحظات:
- لم يتم التحقق من الرموز الدولية ، لذلك قد تكون موجودة أو غير موجودة.
- في التعبيرات العادية ، يشير \ s إلى أي حرف مسافة بيضاء مثل مسافة أو علامة تبويب أو حرف رجوع أو سطر جديد. للسماح بالمسافات فقط ، استخدم [- \. ] بدلاً من [- \. \ s].
- [^ 13] سيطابق أي حرف مفرد ليس 1 أو 3. سيتطابق
- [^ 1-3] مع أي حرف واحد ليس 1 ، 2 أو 3 (أي أي رقم من 1 إلى 3).
- لا يعمل التعبير العادي أعلاه إلا مع السلاسل أحادية السطر . في حالة سلاسل سطر milti ، يتطابق الحرفان ^ و $ مع بداية ونهاية كل سطر بدلاً من بداية سلسلة الإدخال ونهايتها ، لذلك يبحث regex فقط في السطر الأول.
- لمطابقة السلاسل التي لا تبدأ بنص معين ، استخدم تعبيرًا عاديًا مثل ^ (؟! lemons). * $
- لمطابقة السلاسل التي لا تنتهي بنص معين ، قم بتضمينربط سلسلة النهاية في نمط البحث: ^ ((؟! lemons $).) * $
Regex to NOT تطابق الحرف
للعثور على السلاسل التي لا تحتوي على حرف معين ، يمكنك استخدام فئات الأحرف التي تم رفضها [^] التي تطابق أي شيء ليس بين قوسين. على سبيل المثال:
في قائمة أرقام الهواتف ، افترض أنك تريد العثور على الأرقام التي ليس لديها رمز البلد. مع الأخذ في الاعتبار أن أي رمز دولي يتضمن علامة + ، يمكنك استخدام فئة الأحرف [^ \ +] للعثور على السلاسل التي لا تحتوي على علامة الجمع. من المهم أن تدرك أن التعبير أعلاه يطابق أي حرف مفرد ليس +. نظرًا لأن رقم الهاتف يمكن أن يكون في أي مكان في سلسلة ، وليس بالضرورة في البداية ، تتم إضافة المُحدِّد الكمي * للتحقق من كل حرف لاحق. تضمن المرتكزات start ^ و end $ أن السلسلة بأكملها قد تمت معالجتها. نتيجة لذلك ، نحصل على التعبير العادي أدناه الذي يقول "لا تطابق الحرف + في أي موضع في السلسلة".
النمط :^ [^ \ +] * $
=RegExpMatch(A5, "^[^\+]*$")
Regex to NOT مطابقة السلسلة
على الرغم من عدم وجود بنية تعبير عادي خاصة لـ لا تتطابق مع سلسلة معينة ، يمكنك محاكاة هذا السلوك باستخدام lookahead سلبي.
لنفترض أنك ترغب في العثور على سلاسل لا تحتوي على الكلمة "lemons". سيعمل هذا التعبير النمطي على معالجة:
النمط : ^ ((؟! lemons).) * $
من الواضح أن بعض الشرح مطلوب هنا. تبدو النظرة السلبية (؟! lemons) إلى اليمين لمعرفة ما إذا كانت هناك كلمة "ليمون" أمامك. إذا لم تكن "lemons" موجودة ، فإن النقطة تطابق أي حرف باستثناء فاصل الأسطر. ينفذ التعبير أعلاه تدقيقًا واحدًا فقط ، ويقوم المُحدد الكمي * بتكرار ذلك صفرًا أو أكثر من المرات ، من بداية السلسلة التي تم ربطها بـ ^ إلى نهاية السلسلة المثبتة بواسطة $.
لتجاهل حالة النص ، قمنا بتعيين الوسيطة الثالثة على FALSE لجعل وظيفتنا غير حساسة لحالة الأحرف:
=RegExpMatch(A5, $A$2, FALSE)
نصائح وملاحظات:
مطابقة غير حساسة لحالة الأحرف
في التعبيرات العادية الكلاسيكية ، يوجد نمط خاص لـ مطابقة غير حساسة لحالة الأحرف (؟ i) ، وهي غير مدعومة في VBA RegExp. للتغلب على هذا القيد ، تقبل وظيفتنا المخصصة الوسيطة الاختيارية الثالثة المسماة match_case . لإجراء مطابقة غير حساسة لحالة الأحرف ، ما عليك سوى تعيينها على FALSE.
لنفترض أنك ترغب في تحديد التواريخ مثل 1 مارس 22 أو 01 مارس 2022. لمطابقة التنسيقات dd-mmm-yyyy و d-mmm-yy ، نستخدم التعبير النمطي التالي.
Pattern : \ ب \ د {1،2} - (ينايرأرقام في أي مكان في السلسلة بما في ذلك عدد مكون من 10 أو 100 رقم. إذا لم يكن هذا ما تبحث عنه ، فضع حد الكلمة \ b على كلا الجانبين.
النمط : \ b \ d {7} \ b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex لمطابقة أرقام الهواتف
نظرًا لأنه يمكن كتابة أرقام الهواتف بتنسيقات مختلفة ، فإن مطابقتها يتطلب تعبيرًا عاديًا أكثر تعقيدًا.
في مجموعة البيانات أدناه ، سنبحث عن أرقام مكونة من 10 أرقام تتكون من 3 أرقام في أول مجموعتين و 4 أرقام في المجموعة الأخيرة. يمكن فصل المجموعات بنقطة أو واصلة أو مسافة. المجموعة الأولى قد تكون أو لا تكون محاطة بأقواس.
النمط: (\ (\ d {3} \)