السلام عليكم ورحمة الله
۞ الحمد لله رب العالمين والصلاة والسلام على سيدنا محمد صلى الله عليه و سلم ۞
اللهم لا علم لنا الا ماعلمتنا إنك أنت الحكيم العليم ،
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وزدنا علما ، وارنا الحق حقا وارزقنا اتباعه
وارنا الباطل باطلا وارزقنا اجتنابه واجعلنا ممن يستمعون القول فيتبعون أحسنه ،
وأدخلنا برحمتك في عبادك الصالحين ،
أما بعد.
اليوم إن شاء الله أردت تقديم لكم موضوع حول التعابير القياسية أو التعابير النمطية
والمعروفة ب
Regular Expression
والتي يرمز لها ب :
RegEx أو RegExp
re[gul]arexpr[essio]n
الهدف : سنحاول بإدن الله في هدا الموضوع تبسيط Pattern بشكل سلس ومبسط لتستطيع فهمه بشكل أدق
نبدأ بالتعريف والمفاهيم الأساسية :
ماهي الـ Regex؟
هي اختصار لـكلمة Regular Expressions ومعناها الحرفي : التعابير النمطية أو القياسية، وهي تقنية تستخدم في معالجة النصوص (String)
ودلك بهدف البحث، أو المطابقة بين سلاسل من الأحرف، أو المقارنة، أو جلب جزء معين من النص حسب شرط محدد
وتعتمد هده التقنية أساسا علــى مـا يسـمـى بالـ Pattern وهي عبارة عن مجموعة رموز تستخدم للتحقق والتمييز بين الأرقام والحروف وأشياء عديدة... سنحاول شرحها بإدن الله
مطور هده التقنية أو بالأحرى هو من ساعد في تطويرها بشكل كبير :
American mathematician : Stephen Cole Kleene
لقرائة المزيد حول تاريخ هده التقنية :
https://en.wikipedia.org/wiki/ Regular_expr ession
إيجابيات هده التقنية :
نأخد مثال : أننا أردنا حذف جميع المسافات الموجودة داخل أحد الملفات
نستطيع عملها إما عن طريق البحث يدوياً في الملف وحذف جميع المسافات التي نجدها،
أو أن نقوم بإنشاء سكربت يحتوي على عدد ضخم من الشروط If والتكرارات Loop ونتأكد من كل حرف عن ما إذا كان بجانبه مسافة أم لا،
أما الحل الاخير فهو باستخدام الـ Regex - فبإمكانك بعبارة واحدة بسيطة لاتتجاوز السطر الواحد أن تقوم بجميع ماسبق،
إدن فاستخدامك لهده التقنية يختصر عليك وقتاً وجهداً هائلاً خاصة في التعامل مع النصوص الضخمة،
+ تستطيع استخدام هذه التقنية مع العديد من اللغات مثل : Java, PHP, Python, C, C#, JavaScript وغيرها...
سنشرح أولا الرموز ودورها الأساسي وبعدها سنضع أمثلة تطبيقية للتوضيح ...
رموز أساسية تستخدم في التقنية :
• الرمز ( "" ) : هذا الرمز يستخدم عندما نريد البحث عن نص معين ...
• الرمز ( ^ ) : هذا الرمز يستخدم للتحقق من بداية النص برمز معين ...
• الرمز ( $ ) : هذا الرمز يستخدم للتحقق من نهاية النص برمز معين ...
• الرمز ( . ) : هذا الرمز يستخدم لجلب أي رمز موجود ما عدا الرمز الذي يشير لسطر جديد ...
• الرمز ( \ ) : يستخدم لتعطيل الرموز المستخدمة في التقـنيـة , ( مثل الرموز السابقة ) او جعل الاحرف العادية كاحرف خاصة مثل الرموز القادمة ...
• الرمز ( \. ) : هذا الرمز يستخدم للتحقق من وجود النقطة ...
• الرمز ( + ) : هذا الرمز يستخدم للتحقق من تكرار الشيء الذي قبله مرة أو اكثر ...
• الرمز ( * ) : هذا الرمز يستخدم للتحقق من تكرار الشيء الذي قبله من صفر ( أي حتى لو لم يكن هناك شيء أصلاً ) إلى ما لا نهاية.
و هي تستخدم للبحث عن تطابق يبدأ بحرف معين و ينتهي بحرف معين دون الإهتمام إذا كان يحتوي على شيء بين هذين الحرفين أم لا.
• الرمز ( \b ) : هذا الرمز يستخدم للتحقق من أن مجموعة من الرموز تمثل كلمة واحدة يعني لا يوجد بينها مسافة
Boundary (حدود النص)
• الرمز ( \d ) : هذا الرمز يستخدم للتحقق من وجود الارقام من 0 إلى 9
any digit from 0 to 9
• الرمز ( \D ) : هذا الرمز يستخدم للبحث عن أي رمز ما عدى الارقام أي هو خلاف الرمز السابق
Any Non-digit character
• الرمز ( \s ) : هذا الرمز يستخدم للتحقق من وجود مسافة ( Space )
Any Whitespace
• الرمز ( \S ) : هذا الرمز يستخدم للبحث عن جميع الرموز ما عدى المسافة أي هو خلاف الرمز السابق
Any Non-whitespace character
• الرمز ( \w ) : هذا الرمز يستخدم للبحث سواءً عن حروف (صغيرة (a-z) أو كبيرة (َA-z)) أو أرقام (0-9)
Any Alphanumeric character
• الرمز ( \W ) : هذا الرمز يستخدم للبحث عن أي رمز غير الحروف والأرقام أي هو خلاف الرمز السابق
Any Non-alphanumeric character
• الرمز ( x|y ) : هذا الرمز يعني أو ، الترتيب جد مهم
في حالة تغيير الترتيب على هدا الشكل y|x سيتم البحث عن y أولا ثم x
OR
• الرمز ( {m} ) : هذا الرمز يستخدم للبحث عن أي رمز يتألف من m رمز يعني عدد مرات تكرار الرمز
الرمز يجب تحديده خارج اللامة وتحديدا قبلها
m Repetitions
• الرمز ( {m,n} ) : هذا الرمز يستخدم للبحث عن أي رمز يتألف من m إلى n رمز يعني عدد المرات التي تكرر فيها الرمز من m مرة إلى n مرة
الرمز يجب تحديده خارج اللامة وتحديدا قبلها
m to n Repetitions
• الرمز ( {m,} ) : هذا الرمز يستخدم للبحث عن أي رمز يتألف من m إلى ما لانهاية من الرموز يعني عدد المرات التي تكرار فيها الرمز من m مرة إلى ما لانهاية
الرمز يجب تحديده خارج اللامة وتحديدا قبلها
m to infinie Repetitions
• ( [...] ) : المعقوفتان يستخدمان للتحقق من وجود أحرف أو أرقام أو رموز،
وعملية التحقق أو البحث داخلهما تتم على التوالي
أي أنه يبحث عن الحرف الأول إدا لم يجده يمر للثاني إدا لم يجده يمر للثالث وهكدا ...
• ( [...^] ) : إدا أضفنا هدا الرمز ^ داخل الرمز السابق فسيتحقق من عدم وجود أحرف او أرقام أو رموز يعني عكس الرمز السابق ...
• يتم استخدام علامة الناقص ( - ) بين المعقوفتين للتحقق من وجود احد الاحرف بين حرفين أو للتحقق من وجود أي رقم بين رقمين ...
• ( [a-z] ) : هذا الرمز يستخدم للتحقق من وجود أي حرف موجود من a إلى z (أحرف صغيرة) ...
• ( [A-Z] ) : هذا الرمز يستخدم للتحقق من وجود أي حرف موجود من A إلى Z (أحرف كبيرة) ...
• ( [0-9] ) : هذا الرمز يستخدم للتحقق من وجود أي عدد موجود من 0 إلى 9 ...
• الرمز ( [\b] ) : هذا الرمز يستخدم للبحث عن الرمز الذي يشير لسطر جديد ...
literal backspace character (U+0008)
طريقة الاستخدام :
تستطيع الجمع بين الرموز السابقة لتكوين تعبير نمطي واحد
مثل : [a-zA-Z]*\s[0-9]
او ان نقوم بفصلها عن طريق المجموعات باستخدام الاقواس
([a-zA-Z])(*\s)([0-9])
كما ان كل مجموعة من المجموعات السابقة نستطيع استدعائها عن طريق الرمز $ .
أمثلة تطبيقية :
سأبدأ بأمثلة في لغة c# وبإمكان أي عضو أن يطرح أمثلة بطريقته الخاصة لتعم الفائدة أكثر
c# تدعم Regular expressions عن طريق namespace :
System.Text.RegularExpressions
في هده الأمثلة تأكد من إضافتك لهده namespace :
using System.Text.RegularExpressions;
داخل هده namespace توجد كلاس إسمها Regex
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.-ctor?view=netframework-4.7.2#System_Text_RegularExpressions_Regex__ctor
داخل هده الكلاس توجد Methods
Regex.Match()
https://msdn.microsoft.com/en-us/library/bk1x0726
Regex.IsMatch()
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.ismatch?view=netframework-4.7.2
Regex.Matches()
https://msdn.microsoft.com/en-us/library/b49yw9s8
Regex.Replace()
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.replace?redirectedfrom=MSDN&view=netframework-4.7.2#System_Text_RegularExpressions_Regex_Replace_System_String_System_String_System_String_
Regex.ٍSplit()
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.split?view=netframework-4.7.2
Match.NextMatch
https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.match.nextmatch?view=netframework-4.7.2
سنعمل على هده الميتود Regex.IsMatch() وهي من نوع Boolean ترجع قيمة True أو False
وتتكون من 4 عناصر input , pattern, options, matchTimeout
سنستعمل في هده الأمثلة فقط عنصرين input و pattern وهما من نوع string
المثال الأول : سنتأكد من أن الكلمة تبدأ ب My
النتيجة : True
وللتأكد من أن النص ينتهي ب gmail نكتب في pattern
النتيجة : True
مثال 2 : نترك الكود كما في المثال السابق ونغير pattern
النتيجة : False
ظهر False لأننا لم نحدد ما يوجد بين My و gmail
هل يوجد بينهما حروف ، أرقام أم رموز
First هي في الأصل حروف
سنضع الرمز الخاص بالتحقق من وجود أحرف وهو \w
سنضعه بينهما ونجرب
ظهر خطأ يخص Backslashes
هممم عند استعمالنا ل Regular expression في c# الموصى به أن نستعمل @ كلاحق في بداية pattern
--------------
When writing regular expression in C#, it is recommended that you use verbatim strings instead of regular strings.
Verbatim strings begin with a special prefix (@) and signal C# not to interpret backslashes and special metacharacters in the string,
allowing you to pass them through directly to the regular expression engine.
This means that a pattern like "\n\w" will not be interpreted and can be written as @"\n\w" instead of "\\n\\w" as in other languages,
which is much easier to read.
------------
هكدا :
النتيجة : False
لمادا ظهر False ولم يظهر True
لأن \w تتحقق من وجود فقط حرف واحد و First مكونة من أربعة حروف
إدن هل سنعمل هكدا :
\w\w\w\w
بطبيعة الحال لا سنستعمل رمز + (لقرائة تعريفه إطلع فوق )
النتيجة : True
مثال 3 : سنغير input
و نغير pattern
النتيجة : True
ظهر True لأن النقطة تتحقق من وجود أي رمز (characters) بما فيهم spaces
ما عدى الرمز الذي يشير لسطر جديد
*********************
بالنسبة للتمارين التطبيقية أنصحكم بهدا الموقع كبداية :
لا تحاول أن تقرأ الحل قبل أن تضع مئات المحاولات أمزح فقط بل الآلاف هههه
روابط مهمة قد تفيدك :
أي إستفسار أو أي شيء غير واضح المرجو طرحه.
\|/ حياكم الله. \|/
.*. بالتوفيق للجميع .*.
أخوكم عبد السلام.
|