بتاريخ: 31 أغسطس 200718 سنة comment_108835 البحث عن التعابير المنتظمةما هو Regular Expressions(REGEXP) في قاعدة بيانات 10G ؟ هو طريقة للبحث و معالجة النصوص البسيطة و المعقدة . يمكنك البحث و الاستقطاع و صياغة النصوص في قاعدة البيانات ابتداء من قاعدة بيانات أوراكل 10G الوظائف التالية: (SUBSTR, INSTR, LIKE and REPLACE ) قد حسنت لدعم عمليات البحث عن التعابير المنتظمة , أن التعابير المنتظمة تدعم مساحة واسعة من السيطرة القياسية .يمكن أن تستخدم هذه الوظائف الجديدة لتحسين أداء عمليات البحث وسميت الوظائف الجديدة بالأسماء التالية : REGEXP_SUBSTR REGEXP_INSTR REGEXP_LIKE REGEXP_REPLACE.المستخدمون الذين كانوا يستخدمون سابقا الأمر (UNIX GREP) للبحث عن التعابير المنتظمة في الملفات النصية قد تكون هذه الوظائف مألوفة لهم مع تقنيات البحث والمفاهيم أيضا .REGEXP_SUBSTR-1:هذه الدالة ترجع البيانات الفعلية التي تطابق النمط المحدد.مثال :لنعتبر أن لدينا أرقام الهاتف بهذه الصيغة 123-456-7890 .لاختيار الأرقام التي في الوسط (456) ماذا يجب أن نفعل ؟ يجب أن نحدد مكان ابتداء الشرطة ونهايتها حتى نستطيع الوصول للأرقام لأن الأرقام محاطة -456- .باستخدام الوظيفة REGEXP_SUBSTR نحتاج أن خبر الأوراكل من أين تبدأ السلسلة في هذه الحالة نحن ننظر لـ(-) , لذلك التعبير المنتظم للبدء في البحث سيكون هكذا : select REGEXP_SUBSTR('123-456-7890', '- نحتاج الآن أن نخبر الأوراكل أن يكمل حتى يجد رمز أخر (-) في السلسلة ولكي نقوم بهذا يجب أن نستخدم المعامل '[^' حيث يقوم هذا المعامل بأخذ جميع القيم في السلسلةماعدا التعابير الممثلة (-), سيكون الأمر الآن هكذا :ملاحظة/ سوف تجد في الملف بالأسفل جميع المعاملات و الوصف لها. select REGEXP_SUBSTR('123-456-7890', '-[^-]+' ) "REGEXP_SUBSTR" from DUAL; REGE ---- -456 تحليل الناتج (كيف تم اقتطاع 456-)؟؟؟هذا الأمر كأنه يخبر الأوراكل بأن ينظر لأول(-) ويأخذ جميع القيم بعده ماعدا الرمز(-).ملاحظة/إذا قمت بإضافة رمز (-) إضافي في نهاية التعبير المنتظم سوف يكون جزء من القيمة العائدة من السلسة : select REGEXP_SUBSTR('123-456-7890', '-[^-]+-' ) "REGEXP_SUBSTR" from DUAL; REGEX ------------ -456- سيكون أغلب المستخدمين و المطورين غير مرتاحين من استعمال هذه الوظائف ولكن سوف ترى سريعا مدى الفاعلية التي ستعطيها لك.ولتوليد نفس الناتج باستخدام الوظائف Substr,Instr وبافتراض أن طول السلسة بين علامة (-) غير معروف نحتاج أن ننفذ هذا الاستعلام : select SUBSTR('123-456-7890', INSTR('123-456-7890', '-',1,1), INSTR('123-456-7890', '-',1,2)- INSTR('123-456-7890', '-',1,1)) from DUAL; SUBS ---- -456 بالمقارنة بين REGEXP_SUBSTR والوظائف السابقة فهي توجز كل الخطوات في خطوة واحدة.كما أن الأوراكل تدعم character classes ,حيث تسمح character classes بكتابة التعابير المنتظمة بشكل أكثر مرونة ويجب أن تكون داخل الأقواس. لنطبق بعض من هذه المعاملات و character classes (التعابير التي تحل مكان المعاملات) ابتداء ببحث بسيط يتم اقتطاع علامة الترقيم من سلسلة نصية :ملاحظة/ سوف تجد في الملف بالأسفل جميع character classes و الوصف لها. select REGEXP_SUBSTR ('MY LEDGER: Debits, Credits, and Invoices 1940', ':' ) "REGEXP_SUBSTR" from DUAL; R - : الآن نستبدل البحث السابق بالبحث عن علامة الترقيم باستخدام character classes[:punct] : select REGEXP_SUBSTR ('MY LEDGER: Debits, Credits, and Invoices 1940', '[:punct:]' ) "REGEXP_SUBSTR" from DUAL; R - : مثال أخر: اقتطاع سلسلة من جملة ابتداء من النقطة حتى أول فاصلة يتم مصادفتها select REGEXP_SUBSTR('MY LEDGER: Debits, Credits, and Invoices 1940','[:punct:][^,]+,' ) "REGEXP_SUBSTR"from DUAL;REGEXP_SU---------: Debits,كما يمكن استخدام [:digit:] character class لإيجاد الأرقام في السلسة: select REGEXP_SUBSTR ('MY LEDGER: Debits, Credits, and Invoices 1940', '[[:digit:]]+' ) "REGEXP_SUBSTR" from DUAL; REGE ---- 1940 كما رأينا في الأمثلة السابقة إن الوظيفة REGEXP_SUBSTR تستعمل التعابير المنتظمة لتحديد نقطة البداية و النهاية من ناتج السلسة وتركيب هذه الوظيفة: REGEXP_SUBSTR(source_string, pattern [, position [, occurrence [, match_parameter ] ] ] ) كما نلاحظ في تركيب الوظيفة إن المتغير: Position: يخبر REGEXP_SUBSTR من أين تبدأ البحث في source_string كما أن قيمته الافتراضية هي 1 (يعني الحرف الأول ).أما المتغير occurrence: هو العدد المشير إلى occurrence of pattern) ) في source_string الذي يجب أن يبحث عنه الأوراكل كما أن قيمته الافتراضية هي 1. إن المتغيرات position و occurrence غير متاحة في الدالة Substr كما أنهم يسمحون لك بدمج إمكانيات من Substr و Instr .أما المتغير :match_parameterوهو نص حرفي يجعلك تغير السلوك المطابق الافتراضي للوظيفة ولن نتطرق له هنا لوجود بعض التعقيدات .REGEXP_INSTR-2:تستخدم هذه الوظيفة التعابير المنتظمة لإعادة نقطة النهاية أو البداية من البحث في(pattern). تعود هذه الدالة بقيمة تمثل مكان النهاية أو البداية من البحث في(pattern) وتعود بقيمة صفر إذا لم تجد تطابق. إن تركيب هذه الدالة كما هو موضح بالأسفل : REGEXP_INSTR (source_string, pattern [, position [, occurrence [, return_option [, match_parameter ] ] ] ]) كما نلاحظ المتغيرات في تركيب هذه الوظيفة و هي نفسها في الوظيفة السابقة REGEXP_SUBSTR ماعدا return_option .ملاحظــــــات/1- إذا كان return_option = صفر سيعيد الأوراكل مكان الحرف الأول من occurrence.2- إذا كان return_option = واحد سيعيد الأوراكل مكان الحرف متبوع بـ occurrence .مثــــــــال:إن الاستعلام التالي سوف يعيد موقع لأول رقم يجده في source_string Select REGEXP_INSTR ('MY LEDGER: Debits, Credits, and Invoices 1940', '[[:digit:]]') from dual; ------------ 42 لاحظ إن الرقم 42 هو يمثل مكان الرقم 1 ولكي تكون النتيجة أكثر وضوح نفذ التالي : Select length('MY LEDGER: Debits, Credits, and Invoices 1940') From dual; ------------- 45 الجملة السابقة عادة بطول السلسلة وهو 45 ويتضح أن أخر قيمة في السلسة هي 0 فإذا كان مكان الصفر =45 إذا من المؤكد إن مكان 1 في السلسة هو 42.REGEXP_LIKE-3:يتم استخدام التعابير المنتظمة في هذه الدالة ضمن البند Where .تركيب الدالة : REGEXP_LIKE(source_string, pattern [match_parameter ] ) مثال :لنفترض وجود جدول باسم Address يحتوي على عمودين الأسماء و أرقام الهاتف ,للاستعلام عن الأسماء الذين تبدأ أسمائهم برقم 415 : select Name from ADDRESS where REGEXP_LIKE (Phone,'415+'); ضمن النمط (pattern ) لهذه الدالة يمكنك كما أشرنا سابقا استخدام جميع مميزات البحث السابقة مثل (character class) وهذه القابلية تجعل عمليات البحث المعقدة سهل جدا . على سبيل كيف تخبر الدالة بأن العمود يحتوي على رقم عددي ؟ بنفس الحل مع المثال السابق و لاكن نستعمل (character class) select Name from ADDRESS where REGEXP_LIKE (Phone, '[[:digit:]]'); :REGEXP_REPLACEوظيفة هذه الدالة البحث عن ((occurrence أو ما يعرف بالحدث للتعبير المنتظم و استبداله بمحتويات النص الحرفي المجهز.وسعت هذه الدالة قابليات الوظيفة (Replace ) في اتجاهات عديدة. إنها تدعم استخدام التعابير المنتظمة في نمط البحث .ملاحظة/ بخصوص هذه الدالة REGEXP_REPLACE لم أوضح طريقة استعمالها نظرا لضيق الوقت .1.docو إلى هنا ننتهي و أتمنى أن يكون موضوع أعجبكم ..... تحياتي . تقديم بلاغ
بتاريخ: 31 أغسطس 200718 سنة comment_108843 الأخ / sky informationاضافة متميزه .. ومجهود متميز ... كما عهدناك من قبل شكرا لك وجزاك الله خيرا تقديم بلاغ
بتاريخ: 31 أغسطس 200718 سنة comment_108845 مشاركة متميزة اخي العزيز sky information بارك الله بك . تقديم بلاغ
بتاريخ: 31 أغسطس 200718 سنة comment_108855 موضوع جدا رائع ومتميز يدل على الاحترافيةمشكور اخي وبانتظار المزيد تقديم بلاغ
بتاريخ: 1 سبتمبر 200718 سنة كاتب الموضوع comment_108923 مشكورين يا شباب علـــــــــــــى التشجيع تقديم بلاغ
بتاريخ: 8 سبتمبر 200718 سنة comment_109439 مواضيع مثل هذه تجعلني اشعر بانني لازلت في اول الطريقزاد فضلك وطال عمرك وعلا قدرك تقديم بلاغ
بتاريخ: 7 يناير 200818 سنة comment_119973 جزاك الله خيراًالمشكلة عندي انه لا يتعرف على هذه الوظائف فهل يجب بناؤها ام تكون جاهزة؟؟؟؟ تقديم بلاغ
بتاريخ: 2 فبراير 200818 سنة comment_121763 السلام عليكمجزاكم خير على نشر العلمزد أخي على الطريق ننتظرالمزيد تقديم بلاغ
بتاريخ: 13 يناير 201016 سنة comment_182208 شـــــــــــــــــــــــــــــــــــــــــــــــكرا تقديم بلاغ
بتاريخ: 23 سبتمبر 201015 سنة comment_200483 Regular Expressionsأثناء الدراسة مر معنا كثيرا هذا المصطلحلكن أول مرة تعاملنا معه بشكل فعلي وكنا مجبرين على التعامل معه كان في مادة المترجمات Compilersفأول الخطوات في كتابة كومبايلر هي وضع القواعد التي تعرف اسم المتحول مثلا، والذي يجب أن يبدأ بحرف ثم مجموعة من الأحرف أو الأرقام.فكان اسم المتحول يكتب بلغة سي بالشكل [a-z][a-z0-9]* العبارة السابقة [a-z] تدل على البدء بمحرف والعبارة التي تليها[a-z0-9]تدل على محرف أو رقموالنجمة تدل على تكرار أو عدم تكرار ما بين الأقواسوبالتالي عند تعريف abc كأسم متحول يتم قبوله، لكن عند تعريف اسم متحول مثل 123a فلا يتم قبوله لأنه لا يحقق قاعدة تعريف متحول المكتوبة في الاعلى.طبعا للتعابير المنتظمة رموز خاصة بها، وباتت منتشرة جدا في كثير من لغات البرمجة، واضافتها لقواعد البيانات أمر ممتاز فعلا لأنه يسهل البحث عن تعابير أو جمل لها احتمالات متعددةفمثلا * تدل على تكرار أو عدم وجود التعبير الذي نبحث عنه+ تدل على تكرار مرة على الأقل أو أكثر- بين محرفين مثل المثال السابق تدل على المجال؟ تدل على تكرار واحد أو عدم وجود التعبير الذي نبحث عنه.فمثلا 0-9 تدل على اي رقم من صفر إلى تسعةأتوقع أن تكون رموز التعابير المنتظمة في اوراكل نفسها، وإن لم تكن نفسها فربما متشابههة إلى حد كبير. تم تعديل 23 سبتمبر 201015 سنة بواسطة sam_t تقديم بلاغ
بتاريخ: 24 سبتمبر 201015 سنة comment_200489 بداية شكرا جزيلا لصاحب الموضوع،الموضوع اعجبني فعلا، فلم أكن أعلم بأن اوراكل اضافت ذلك منذ مدة طويلة!!!فقمت بالبحث في Oracle Database 11g documentation فوجدت الصفحة التالية:http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28424/adfns_regexp.htm#CHDDFAFAالتي ستكون مرجع لنا جميعا عند التعامل مع التعابير المنتظمة.وكما قلت في مشاركتي السابقة فإن التعامل مع التعابير المنتظمة يكون باستخدام رموز خاصة بها، ووجدت أنها مطابقة للرموز المستخدمة في التعابير المنتظمة كلغة موحدة standard في جميع لغات البرمجةوتدعى Metacharactersوقمت بشرح سريع لـ*+؟وهي مذكورة في الرابط السابق الذي وضعته في الاعلى.واضيف بأنه يمكن وضع مثال عن اهمية التعابير المنتظمة بالمثال التالي:نريد جميع الأسطر التي في قيم احد اعمدتها الحرف a مكرر مرتين أو أكثر يليه الحرف b مكرر مرتين أو أكثر ودون الإهتمام بالاسطر التي عدد التكرارات فيها أقل من ذلك.كيف سيكون شكل الإستعلام بالطريقة التقليدية العادية برأيك؟؟؟الطريقة العادية تجبر الذي يكتب تعليمة الاستعلام كتابة جميع احتمالات تكرار الحرف a مع احتمالات كتابة الحرف b ثم وضعها جميعا في تعليمة الاستعلام ويفصل بينها or. select * from table1 where column_name1 like '%aabb%' or column_name1 like '%aaabb%' or column_name1 like '%aaaabb%' or column_name1 like '%aaaaabb%' or column_name1 like '%aabbb%' or column_name1 like '%aaabbb%' or column_name1 like '%aaaabbb%' or ... ... أما بالتعابير المنتظمة فببساطة يمكن أن تكون التعليمة من الشكل select * from table1 where REGEXP_LIKE (column_name1,'(a){2,}({2,}' ) لنحصل على النتيجة المطلوبةلاحظوا أيضا كيف تقلص حجم الكود بشكل رهيبباختصار متى نستخدم التعابير المنتظمة؟ الجواب عند الحالات المعقدة، والتي لها احتمالات كثيرة لكن عدد هذه الإحتمالات محدد ومنتهي .في الملف المرفق ملف لتجريب الدالة regexp_likeللمثال الذي وضعتهحاولت أيضا بتعديل المثال السابق، وجعله يقوم بالبحث عن عدد التكرارات ضمن مجال معين من التكرارات.مثلا كأن يكون الحرف a يتكرر من 2 إلى خمس مرات، وكذلك الحرف b من 2 إلى خمس مراتفكتبت التعليمة التالية: select * from table1 where REGEXP_LIKE (column_name1,'(a){2,5}({2,5}' ) فكانت نتيجة الاستعلام تعطي اسطر اضافية فيها عدد تكرارات a تساوي 6 أو سبعة ... وهذا لم يكن مرغوباعتقد بأن السبب هو استخدام الدالة REGEXP_LIKE التي تحضر كل سطر يتطابق مع التعبير المطلوب بغض النظر عن البيانات التي يحويها قبله أو بعدهابحثوا بنفسكم وأفيدونا في حال وصلتم لجواب حول هذه النقطة. REGEXP.rar تم تعديل 24 سبتمبر 201015 سنة بواسطة sam_t تقديم بلاغ
بتاريخ: 20 أكتوبر 201015 سنة comment_201872 gazak allah 5ayran 3ala haza el mawdooo3 el mohem thanks alot تقديم بلاغ
انضم إلى المناقشة
يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.