در این دورهٔ آموزش رایگان به بررسی قوانینی در Regular Expression یا به اختصار RegEx پرداختیم که با فراگیری آنها هم میتوان به سادگی به تفسیر الگوهای رِجِکس پرداخت و هم در شرایط مختلف و بسته به نیاز خود، اقدام به نوشتن الگوهایی خاص نمود که در این بخش به طور خلاصه آنها را مرور خواهیم نمود.
حروفی با معنا و مفهوم خاصی در RegEx
یک سری کاراکترها در رِجِکس هستند که دارای معنا و مفهوم خاصی هستند که عبارتند از:
d\
این کاراکتر کلیهٔ اعداد از ۰ تا ۹ را شامل میگردد. به طور مثال، الگوی /file_\d/
حاکی از آن است که در انتهای استرینگ میباید یک عدد از ۰ تا ۹ قرار گیرد. برای نمونه، استرینگ file_8 با این الگو مَچ خواهد شد.
D\
هر کاراکتری که یک عدد صحیح نباشد با این علائم نشان داده خواهد شد. به طور مثال، پَترن /D\D\D\/
با استرینگهای AbC و abc مَچ خواهد شد.
w\
این حرف کلیهٔ حروف به اصطلاح ASCII به علاوهٔ اعداد و آندراِسکور را پوشش میدهد. به طور مثال، الگوی /w-\w\w\w\/
با مثالی همَچون A-b_1 مَچ میگردد.
W\
این کاراکتر با هر چیزی که یکی از حروف الفبای انگلیسی را شامل نگردد مَچ خواهد شد. به طور مثال، الگوی /W\W\/
با استرینگ #@ مَچ خواهد شد.
s\
این کاراکتر تَب، اِسپیس و همچنین خط جدید یا به اصطلاح New Line را شامل میگردد. برای مثال، الگوی /a\sb\sc/
با استرینگی همَچون a b c مَچ خواهد شد.
S\
این کاراکتر با هر چیزی که اِسپیس نباشد مَچ خواهد شد به طوری که الگویی همچون /S\S\S\S\/
میتواند با استرینگ YoYo مَچ گردد.
.
علامت نقطه بدان معنا است که هر کاراکتری میتواند شامل گردد. به طور مثال، الگوی /a.c/
میتواند با استرینگهای abc و a@c مَچ گردد. اگر هم بخواهیم بگوییم «هر چیزی به هر تعدادی» نیز میتوان الگوی /*./
را به کار گیریم به طوری که کاراکترهایی همَچون fdafsfd@#12 با این الگو مَچ خواهند شد. اگر هم بخواهیم خودِ علامت نقطه شامل گردد، میباید آن را با استفاده از درج علامت \
به اصطلاح Escape کرد. برای مثال، الگوی /a\.b\.c/
با استرینگ a.b.c مَچ خواهد شد (لازم به یادآوری است که علامت \
برای اِسکیپ کردن دیگر کاراکترهای خاص همچون ?
یا +
و یا $
نیز میتواند مورد استفاده قرار گیرد.)
کاراکترهای نشاندهندهٔ تعداد
برخی کاراکترهای خاص در رِجِکس هستند که اصطلاحاً تحت عنوان Quantifier شناخته میشوند که عبارتند از:
+
این علامت نشانگر «یک یا بیش از یک بار تکرار» است. به طور مثال، الگوی /+w\d\/
نشان میدهد که پس از یک حرف میتوانیم یک یا بیش از یک عدد وارد سازیم به طوری که استرینگهایی همچون a-1 و a-123 با این پَترن مَچ میشوند.
*
این علامت نشانگر «هیچ بار، یک بار و یا چند بار تکرار» است. به طور مثال، الگوی /*A*B*C/
هم با استرینگ AAACC مَچ میشود و هم با استرینگی همَچون AAABBCCC.
?
این علامت به منظور اختیاری کردن یک کاراکتر به کار میرود؛ به عبارتی، هم میتواند هیچ بار تکرار نشود و هم یک بار تکرار گردد. برای مثال، الگوی /?cats/
هم با استرینگ cat و هم با استرینگ cats مَچ میشود.
{}
علائم آکولاد باز و بسته میتوانند به منظور مشخص کردن یک تعداد دقیق از کاراکترها استفاده شوند. به طور مثال، اگر بخواهیم دستور دهیم که حرف a فقط سه بار تکرار شود، میتوان از الگوی /{3}a/
استفاده کرد به طوری که استرینگ aaa با این پَترن مَچ خواهد شد. همچنین اگر بخواهیم مشخص سازیم که حرف a هم میتواند سه بار و هم چهار بار تکرار گردد، میتوان از الگوی /{3,4}a/
استفاده نمود به طوری که از این پس هم استرینگ aaa و هم استرینگ aaaa با این الگو مَچ خواهند شد و در نهایت هم اگر بخواهیم بگوییم که حرف a هم میتواند سه بار و هم تا بینهایت بار تکرار شود، میتوان از الگوی /{,3}a/
استفاده کرد به طوری که از این پس هم aaa و هم aaaaaaaaaaa با این الگو سازگار خواهند بود (به عنوان مثالی دیگر، الگوی /{2}(hello)/
با استرینگ hellohello مَچ خواهد شد. در واقع، از یک گروه در این پَترن استفاده کردهایم که در ادامه بیشتر این مفهوم را توضیح خواهیم داد.)
علائم ^ و $
علامتهای فوق به ترتیب تحت عنوان Caret و Dollar Sign تلفظ میشوند و در RegEx اصطلاحاً Anchor نامیده میشوند.
^
این علامت شروع استرینگ را مشخص میسازد. برای مثال، اگر بخواهیم دستور دهیم که استرینگ مذکور میباید ابتدا با حروف behzad شروع شود، میباید الگویی همچون /*.behzad^/
بنویسیم به طوری که از این پس استرینگهایی مثل behzad moradi و یا behzad is an author با این الگو مَچ خواهند شد.
$
این علامت پایان یک استرینگ را مشخص میسازد به طوری که مثلاً اگر بخواهیم دستور دهیم تا یک استرینگ حتماً میباید با حروف ly پایان پذیرد، میباید الگویی همچون /$ly*./
بنویسیم به طوری که واژگانی همَچون slowly یا beautifully با این پَترن سازگار خواهند بود.
علائم () و []
در طول این دورهٔ آموزشی از طریق مثالهای مختلفی مقولهٔ Group در رِجِکس را مورد بررسی قرار دادیم و ادامه نیز به طور خلاصه به مرور انواع و اقسام گروهها خواهیم پرداخت.
()
فرض کنیم میخواهیم حرف اول یک استرینگ a یا b باشد که برای این منظور میتوان از گروه (a|b)
استفاده نمود. برای مثال، الگوی /1-(a|b)/
با استرینگهای a-1 و b-1 سازگار خواهد بود اما هرگز با c-1 مَچ نخواهد شد (به عنوان مثالی دیگر، الگوی /it is (very )?cold outside/
با استرینگهای it is cold outside و it is very cold outside سازگار خواهد بود؛ به عبارتی، کلمهٔ very آپشنال (انتخابی) است زیرا پیش از این توضیح دادیم که هر آنچه قبل از علامت ?
قرار گیرد، هم میتواند هیچ بار تکرار نشود و هم یک بار تکرار گردد و از آنجا که قصد داریم کل کلمهٔ very هدف قرار داده شود، آن را داخل علائم ()
قرار دادهایم.)
[]
مثال فوق را با استفاده از الگوی /1-[ab]/
نیز میتوان عملی ساخت. در واقع، یکی از کاراکترهایی که داخل علائم []
میآیند میباید در ابتدای استرینگ باشد. اگر هم بخواهیم دستور دهیم تا حروف a یا b در ابتدای استرینگ نباید باشند، میتوان از علامت ^
به صورت /1-[ab^]/
استفاده کرد به طوری که از این پس استرینگهای a-1 و b-1 با این پَترن مَچ نخواهند شد اما استرینگی همچون c-1 با این الگو سازگار خواهد بود.
به علاوه، اگر بخواهیم یک بازه نیز تعریف کنیم، میتوانیم از علائم []
استفاده نماییم. برای مثال، الگوی /[A-Za-z]/
با یکی از حروف الفبای انگلیسی خواه به صورت بزرگ همچون A و خواه به صورت کوچک مثل a مَچ خواهد شد. بر همین منوال، میتوان طیفی از اعداد را نیز مشخص کرد به طوری که مثلاً الگوی /[7-0]/
فقط و فقط اعداد ۰ تا ۷ را شامل میگردد؛ در حقیقت، عددی همچون ۵ با این الگو سازگار است اما ۸ سازگار نخواهد بود چرا که خارج از بازهٔ تعریفشده است.
کاراکترهای g و i
در رگیولار اکسپرشن یک سری حروف هستند که تحت عنوان Modifier شناخته میشوند که در ادامه دو مورد از کاربردیترین آنها را مرور خواهیم کرد.
g
این کاراکتر که برگرفته از کلمهٔ Global است کاربردش در مواقعی است که بخواهیم سراسر یک استرینگ را به دنبال الگوی خاصی بگردیم. برای مثال، الگوی global/g/
حاکی از آن است که به هر تعداد بار که کلمهٔ global داخل یک رشته تکرار شده باشد، تمامی آنها یافت خواهند شد به طوری که برای مثال هم استرینگ global و هم global global global با این پَترن سازگارند.
i
این حرف برگرفته از اصطلاح Case Insensitive است بدان معنا که الگویی با این Modifier نسبت به بزرگی و کوچکی حروف حساس نخواهد بود (لازم به یادآوری است که در رِجِکس به طور پیشفرض بزرگی و کوچکی حروف مبنا قرار داده میشود.) برای مثال، الگوی sky/i/
هم با کلمهٔ sky با حرف اول کوچک و هم با sKy با حرف وسط بزرگ مَچ خواهد بود.