❤🚭welcome to https://er-ramimohamed.blogspot.com/ please if ou have any question or suggestion dont heisting 🚭 to send it to me at erramixx@gmail.com thanks محمــــــــــــد الــــــــــــــــرامي يرحبكم ويتمنى لــــــــــكم ان تقضوا 🌹🌹وقت مفيد

الأحد، 14 أبريل 2019

Re[gul]ar Expr[essio]n

السلام عليكم ورحمة الله
۞ الحمد لله رب العالمين والصلاة والسلام على سيدنا محمد صلى الله عليه و سلم ۞ 
اللهم لا علم لنا الا ماعلمتنا إنك أنت الحكيم العليم ،
اللهم علمنا ما ينفعنا وانفعنا بما علمتنا وزدنا علما ، وارنا الحق حقا وارزقنا اتباعه
وارنا الباطل باطلا وارزقنا اجتنابه واجعلنا ممن يستمعون القول فيتبعون أحسنه ،
وأدخلنا برحمتك في عبادك الصالحين ،
أما بعد. 

  
اليوم إن شاء الله أردت تقديم لكم موضوع حول التعابير القياسية أو التعابير النمطية
والمعروفة ب
Regular Expression
والتي يرمز لها ب :
RegEx أو RegExp

re[gul]arexpr[essio]


الهدف : سنحاول بإدن الله في هدا الموضوع تبسيط Pattern بشكل سلس ومبسط لتستطيع فهمه بشكل أدق 

نبدأ بالتعريف والمفاهيم الأساسية :
ماهي الـ Rege
هي اختصار لـكلمة Regular Expressions ومعناها الحرفي : التعابير النمطية أو القياسية، وهي تقنية تستخدم في معالجة النصوص (String)
ودلك بهدف البحث، أو المطابقة بين سلاسل من الأحرف، أو المقارنة، أو جلب جزء معين من النص حسب شرط محدد
وتعتمد هده التقنية أساسا علــى مـا يسـمـى بالـ Pattern وهي عبارة عن مجموعة رموز تستخدم للتحقق والتمييز بين الأرقام والحروف وأشياء عديدة... سنحاول شرحها بإدن الله
مطور هده التقنية أو بالأحرى هو من ساعد في تطويرها بشكل كبير  :

American mathematician : Stephen Cole Kleene
لقرائة المزيد حول تاريخ هده التقنية :
https://en.wikipedia.org/wiki/ Regular_expressio
إيجابيات هده التقنية :
نأخد مثال : أننا أردنا حذف جميع المسافات الموجودة داخل أحد الملفات
نستطيع عملها إما عن طريق البحث يدوياً في الملف وحذف جميع المسافات التي نجدها،
أو أن نقوم بإنشاء سكربت يحتوي على عدد ضخم من الشروط 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
ما عدى الرمز الذي يشير لسطر جديد 
********************* 

بالنسبة للتمارين التطبيقية أنصحكم بهدا الموقع كبداية :
لا تحاول أن تقرأ الحل قبل أن تضع مئات المحاولات أمزح فقط بل الآلاف هههه 
  
روابط مهمة قد تفيدك :
W3schol https://www.w3schools.com/jsref/jsref_obj_regexp.asp
https://docs.microsoft.com/enus/previous-versions/ visualstudio/visual-studio- 2008/ae5bf541(v=vs.90) : Microsoft
https://regexper.com/
https://regexone.com/  Wiki  https://en.wikipedia.org/wiki/Regular_expression
https://regexone.com/references/csharp
JAVA https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html 
 PHP http://php.net/manual/en/class.regexiterator.php 
 JavaScript : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions 
أي إستفسار أو أي شيء غير واضح المرجو طرحه.
\|/ حياكم الله. \|/ 
.*. بالتوفيق للجميع .*.
 أخوكم عبد السلام.
01:42 - 2019/02/28: آخر تغيير للنص بواسطة abdessalam kilya
عدد مرات تغيير النص: 5
abdessalam kilya
 15:30 - 02/09معلومات عن العضورد على الموضوع بإضافة نص هذه المشاركةأضف رد سريع بإقتباس لهذا الرد

مثال 4 : الرمز (x|y)
 
مثال 5 : التحقق من الإيميل
مثال 6 : كمثال نريد التحقق من بعض strings أنها عبارة عن مواقع
 
النتيجة :
بالنسبة لهدا المثال استعملت الأقواس ودلك لفصل كل جزء لوحده
فكما تلاحظون في الروابط فهناك من يوجد به http أو https أو لا توجد ..
أو من يتكون من www أو لا ..
ففي هده الحالة استعملت علامة التعجب ? التي نسيت أن أشرحها مع الرموز في الموضوع
Characters optional 
فدورها هو التأكد أو التحقق من وجود الرمز الدي يوجد قبلها وجدته أم لم تجده سيتم إكمال pattern
إدن نقول أن علامة التعجب تلغي الرمز الدي قبلها ترجعه optional
-هدا الرمز {w{3 يعني التحقق من وجود حرف w مكرر ثلاث مراة
بإمكان صياغة هدا المثال بعدة طرق وهده واحدة :
 
النتيجة :
 
أو :
 
النتيجة :
 

إدا كان أي استفسار أو أي غموض بخصوص pattern المرجو طرحه ...

0 التعليقات:

إرسال تعليق