الانتقال إلى المحتوى
View in the app

A better way to browse. Learn more.

مجموعة مستخدمي أوراكل العربية

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

التعابير المنتظمة وتطور الوظائف في أوراكل 10g

Featured Replies

بتاريخ:

البحث عن التعابير المنتظمة

ما هو 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
و إلى هنا ننتهي و أتمنى أن يكون موضوع أعجبكم ..... تحياتي .

بتاريخ:

الأخ / sky information

اضافة متميزه .. ومجهود متميز ... كما عهدناك من قبل

شكرا لك وجزاك الله خيرا

بتاريخ:

موضوع جدا رائع ومتميز يدل على الاحترافية

مشكور اخي وبانتظار المزيد

بتاريخ:
  • كاتب الموضوع

مشكورين يا شباب علـــــــــــــى التشجيع

بتاريخ:

مواضيع مثل هذه تجعلني اشعر بانني لازلت في اول الطريق
زاد فضلك وطال عمرك وعلا قدرك

  • بعد 3 شهور...
بتاريخ:

جزاك الله خيراً
المشكلة عندي انه لا يتعرف على هذه الوظائف فهل يجب بناؤها ام تكون جاهزة؟؟؟؟

  • بعد 4 أسابيع...
بتاريخ:

السلام عليكم
جزاكم خير على نشر العلم
زد أخي على الطريق ننتظرالمزيد

  • بعد 1 سنة...
بتاريخ:

شـــــــــــــــــــــــــــــــــــــــــــــــكرا

بتاريخ:

شكرا أخي على هذا الموضوع الرائع

بتاريخ:

جزاكم الله خيرا

  • بعد 2 أسابيع...
بتاريخ:

موضوع رائع

بتاريخ:

Thanks a lot

  • بعد 3 شهور...
بتاريخ:

جزاك الله خير إستمر أخي على العطاء المتواصل

  • بعد 4 شهور...
بتاريخ:

Regular Expressions

أثناء الدراسة مر معنا كثيرا هذا المصطلح
لكن أول مرة تعاملنا معه بشكل فعلي وكنا مجبرين على التعامل معه كان في مادة المترجمات Compilers
فأول الخطوات في كتابة كومبايلر هي وضع القواعد التي تعرف اسم المتحول مثلا، والذي يجب أن يبدأ بحرف ثم مجموعة من الأحرف أو الأرقام.
فكان اسم المتحول يكتب بلغة سي بالشكل

[a-z][a-z0-9]*


العبارة السابقة
[a-z]
تدل على البدء بمحرف
والعبارة التي تليها
[a-z0-9]
تدل على محرف أو رقم
والنجمة تدل على تكرار أو عدم تكرار ما بين الأقواس
وبالتالي عند تعريف
abc كأسم متحول يتم قبوله، لكن عند تعريف اسم متحول مثل 123a فلا يتم قبوله لأنه لا يحقق قاعدة تعريف متحول المكتوبة في الاعلى.

طبعا للتعابير المنتظمة رموز خاصة بها، وباتت منتشرة جدا في كثير من لغات البرمجة، واضافتها لقواعد البيانات أمر ممتاز فعلا لأنه يسهل البحث عن تعابير أو جمل لها احتمالات متعددة
فمثلا
* تدل على تكرار أو عدم وجود التعبير الذي نبحث عنه
+ تدل على تكرار مرة على الأقل أو أكثر
- بين محرفين مثل المثال السابق تدل على المجال
؟ تدل على تكرار واحد أو عدم وجود التعبير الذي نبحث عنه.
فمثلا 0-9 تدل على اي رقم من صفر إلى تسعة

أتوقع أن تكون رموز التعابير المنتظمة في اوراكل نفسها، وإن لم تكن نفسها فربما متشابههة إلى حد كبير.

تم تعديل بواسطة sam_t

بتاريخ:

بداية شكرا جزيلا لصاحب الموضوع،

الموضوع اعجبني فعلا، فلم أكن أعلم بأن اوراكل اضافت ذلك منذ مدة طويلة!!!
فقمت بالبحث في
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

تم تعديل بواسطة sam_t

  • بعد 4 أسابيع...
بتاريخ:

gazak allah 5ayran 3ala haza el mawdooo3 el mohem
thanks alot

بتاريخ:

thx alot for this important topic

  • بعد 2 سنة...
بتاريخ:

مشكورين

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية

Account

Navigation

البحث

إعداد إشعارات المتصفح الفورية

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.