|
عنوان مقاله : نقش عبارات با قاعده در پردازش رشته ها ارائه کننده : شهرام سلامی منبع : کتاب " اوراکل 10g دیدگاه کاربردی " |
|||||||||||||||||||||||||||||||||||||||||||||||
|
عبارت با قاعده[1] در نسخه 10g اوراکل، ابزار توانمندی برای کار با داده های رشته ای است. عبارت با قاعده نمادهايی را برای بيان الگوهای متنی ارائه می دهد. عبارت با قاعده از تعدادی کاراکترهای ثابت و کاراکترهای کمکی تشکيل می گردد. از عبارات با قاعده برای جستجو، جايگزينی و کنترل صحت فرمت داده هايی نظير کدپستی، شماره تلفن، آدرس پست الکترونيک و ... استفاده می شود. توابع regexp_like، regexp_instr، regexp_substr و regexp_replace برای اين منظور در اوراکل تعريف شده است. اين توابع نسبت به عملگر و توابع مشابه خود در SQL ، از قابليت و انعطاف بسيار بالايی برخوردار است. 1- تعريف عبارت با قاعده در اين بخش، نحوه تعريف عبارات با قاعده در اوراکل، بيان می گردد. در ساده ترين حالت، عبارت با قاعده فاقد کاراکترهای کمکی است. برای مثال، رشته cat يک عبارت با قاعده است که توالی سه کاراکتر تشکيل دهنده را توصيف می کند. اين الگو در کلماتی نظير cat، location و catalog يافت می شود. در ادامه کاراکترهای کمکی ( نماد های قراردادی ) که در تعريف عبارات با قاعده استفاده می شود، معرفی می گردد. نماد ( . ) بيانگر هر کاراکتری ( بجز خط جديد ) می باشد. برای مثال، عبارت باقاعده a.b با هر رشته ای که کاراکتر a ، يک کاراکتر نامشخص و پس از آن کاراکتر b را شامل شود، مطابقت دارد. برای مثال رشته های axb ، xaybx و abba را می توان نام برد. بکاربردن نماد ابتدای رشته ( ^ ) و نماد انتهای رشته ( $ ) در ابتدا و انتهای الگو، رشته های پذيرفته شده را محدود می کند. برای مثال، عبارت با قاعده ^a.b$ رشته هايی دقيقا با سه کاراکتر، مانند aab ، abb و axb را می پذيرد. اين عبارت معادل a_b هنگام استفاده از عملگر like در SQL است. امکان بيان تکرار، نيز در عبارات با قاعده وجود دارد. برای مثال، عبارت با قاعده ^a.*b$ بيانگر رشته هايی است که با حرف a شروع شده و با حرف b خاتمه می يابد. در اين مثال، نماد ( * ) ، تکرار صفر يا بيشتر را بيان می کند. اين عبارت معادل a%b هنگام استفاده از عملگر like در SQL است. در جدول زير، نمادهای چندی نما[2] بيان شده است :
جدول 4-2: چندی نما در عبارات با قاعده عبارات با قاعده امکان انتخاب و گروه بندی را نيز فراهم می کند. برای مثال، در عبارت b(an)*a گروه کاراکترهای an به هر تعداد می تواند، تکرار شود. رشته هايی مانندba ، bana و xbananax توسط اين عبارت، پذيرفته می شود. در جدول 4-3، نمادهای انتخاب و گروه بندی آمده است :
جدول 4-3: نماد انتخاب و گروه بندی در عبارات با قاعده بعنوان مثالی ديگر، عبارت t ( a | e | i ) n رشته های مانند tan ، ten ، tin و pakistan را می پذيرد. اين عبارت با عبارت t [ aei ] n معادل است. بيشتر کاراکترهای واقع در " [ ] " بعنوان ثابت تلقی می شود. باستثنای نمادهای " ^ " و " - " که در جای خاصی، نفی و دامنه را بيان می کند. برای مثال، در عبارت [^,] ، نماد " ^ " به معنای نفی می باشد و هر کاراکتری غير از " , " را می پذيرد و عبارت [a-m] دامنه کاراکترهای بين a و m را می پذيرد. عبارات با قاعده در اوراکل، امکان بيان کلاسی از کاراکترها را نيز فراهم می کند. کلاسهای کاراکتری POSIX[3] برای تامين اين منظور در اوراکل، حمايت می شود. برای مثال، [:digit:] بمعنای کلاسی از کاراکترهای عددی می باشد. کلاسهای کاراکترهای POSIX ، هنگام استفاده، بايد در نماد"ليست کاراکترها" ( [ ] ) محصور شود. برای مثال، عبارت با قاعده [[:digit:]]{5} رشته هايی با پنج عدد متوالی را می پذيرد. جدول زير، ليستی از کلاسهای کاراکتری از پيش تعريف شده را نشان می دهد :
جدول 4-4: کلاسهای کاراکتری POSIX 2- استفاده از عبارت با قاعده در اين بخش، توابعی که در اوراکل برای کار با عبارات با قاعده تعريف شده است با مثالهايی تشريح می گردد : regexp_like ( source_string, pattern ) اين تابع تشابه رشته با الگو را تست می کند. برای مثال، پرسش زير، مقادير کد پستی را که در آنها مقادير غير عددی بکار رفته است، بدست می دهد : select zip ZIP در مثال زير، از regexp_like در تعريف قاعده جامعيتی استفاده شده است : create table empx ( empno number ( 4 ), postal_code varchar2 ( 11 ) constraint empx_ck ( regexp_like ( '^([[:digit:]]{5}-[[:digit:]]{5}|[[:digit:]]{10})$' ) )
);
برای مثال، در اين جدول، مقدار 67116-15189 و يا 1518967116 برای کد پستی معتبر است. regexp_instr ( source_string, pattern [, start_position [, occurrence [, return_option ]]] ) اين تابع محل شروع يک الگو در رشته را تعيين می کند. مقدار پيش فرض return_option صفر، بمعنای محل شروع الگو است و مقدار يک، بمعنای محل شروع کاراکتر بعد از الگو می باشد. برای مثال، پرسش زير، محل شروع کد پستی پنج رقمی را در انتهای رشته مشخص می کند : select
regexp_instr ( 'Joe Smith, 10045 Berry Lane, CA 91234',
در مثالی پيچيده تر، کد پستی می تواند، بصورت يک عدد پنج رقمی و يا يک عدد پنج رقمی که با يک ( - ) از ادامه چهار رقمی آن جدا شده است، مشخص شود. پرسش زير، محل شروع کد پستی در انتهای رشته را بدست می دهد : select regexp_instr ( 'Joe Smith, 10045 Berry Lane, CA91234-1234', '[[:digit:]]{5}(-[[:digit:]]{4})?$' ) as rx_instr from dual;
regexp_substr ( source_string, pattern [, position [, occurrence ]] ) اين تابع زير رشته مطابق با الگوی مشخص شده را باز می گرداند. برای مثال پرسش زير، زير رشته محصور در ( , ) را باز می گرداند : select regexp_substr ( 'first field, second field , third field', ', [^,]*,' )
as rx_substr
regexp_replace ( source_string, pattern [, replace_string [, position [, occurrence,]]] ) اين تابع يک رشته را با ديگری جايگزين می کند. برای مثال، در پرسش زير، بيش از يک space به يکی تبديل می شود :
select
regexp_replace ( 'Joe Smith', '( ){2,}', ' ' )
as
rx_replace
در اين پرسش، بين ( ) يک space قرار دارد. 3- ارجاع به عقب در عبارت با قاعده يک قابليت مفيد عبارات با قاعده امکان حفظ زير عبارت ديده شده، برای ارجاع بعدی است. به اين قابليت ارجاع به عقب[4] گفته می شود. از پرانتز برای ايجاد زير عبارت ( که دستيابی به مقادير را به فرم \digit ممکن می سازد، ) استفاده می شود. زير عبارات از چپ به راست، در بافرهای موقتی با نامهای \1 الی \9 قابل دسترسی است. برای مثال، از اين قابليت، در پرسش زير، استفاده شده است : select regexp_replace ( 'Ellen Hildi Smith',
'(.*) (.*) (.*)', '\3, \1 \2' ) as
rx_replace
rx_replace در مثالی ديگر، پرسش زير، در رشته داده شده، دو کلمه يکسان متوالی که با تعدادی space جدا شده است را بدست می دهد : select
regexp_substr ( 'The final test is is the implementation', SUBSTR |
|||||||||||||||||||||||||||||||||||||||||||||||
| Copyright 2008 Parsicom Co. All Rights Reserved. | |