آرمان
آرمان
خواندن ۱۱ دقیقه·۴ سال پیش

عبارت های با قاعده - Regular Expressions

"\" => متا کاراکتر Escape یا Escape Character
تمامی متا کاراکتر ها برای تطبیق خود نشانه متا کاراکتر در متن نیاز به Escape Character دارند.
مثال: "\\" => پیدا کردن "\" در متن و یا ".\" پیدا کردن "." در متن
"." => هر کاراکتری
"[" و "]" => هر کارکتری بین [ و ] به عنوان کارکتر مجاز بعدی شناخته میشود.توجه داشته باشید که تنها یکی از کاراکترهای مجموعه که بین [ و ] قرار میگیرند می توانند به عنوان کارکتر مجاز بعدی وجود داشته باشند نه تمامی آن کاراکتر ها.
"-" => تعیین محدوده در بین "[" و "]"
مثال: [9-0] یا [A-Za-z] یا [A-Za-z0-9]
نکته "-" در خارج از "[" و "]" همان کارکتر "-" می باشد و نیازی به Escape character ندارد.
"^" => تطبیق هر کاراکتری بجز در بین "[" و "]"
مثال: [9-0^] =>به معنی هر کارکتری بجز عدد.
متا کاراکتر های Whitespace

"[b\]" => تطبیق کلید backspace
"f\" => تطبیق کلید Form feed
"r\" => تطبیق کلید Carriage return (فضایی که دکمه Enter ایجاد میکند و به ابتدای خط بعدی میرود)
''t\" => تطبیق کلید Tab
"v\" => تطبیق کلید Vertical tab

نکته: سیستم عامل ویندوز برای تشخیص انتهای یک خط در یک فایل از کاراکترهای r\n\ استفاده میکند. اما Unix و Linux فقط از n\ بدین منظور استفاده میکنند. پس برای تطبیق حتما n\ باید باشد ولی وجود r\ اختیاری است.

پرکاربردترین ها: r\ و n\ و t\ می باشد.
میانبر ها
"d\" => میانبر [9-0] تطبیق هر عددی
"D\" => میانبر [9-0^] تطبیق هر کاراکتری بجز رقم

نکته کلی مهم:

متاکاراکترهایی مانند متاکاراکترهای بالا (d\ و D\) - اگر حرف کوچک باشند به معنای تطبیق آن متاکاراکتر و اگر با حرف بزرگ باشند به معنای تطبیق هر کاراکتر بجز آن متاکاراکتر است.

میانبرها
"w\" => میانبر [_a-zA-Z0-9] تطبیق هر کارکتر عددی و حرف کوچک و بزرگ و زیر خط
"W\" => میانبر [_a-zA-Z0-9^] تطبیق هر کارکتر بجز عددی و حرف کوچک و بزرگ و زیر خط
میانبر کارکترهای نامرئی
"s\" => میانبر [f\n\r\t\v\] تطبیق هر کاراکتر نامرئی
"S\" => میانبر [f\n\r\t\v\^] تطبیق هر بجز کاراکتر نامرئی
متاکاراکتر Ctrl
"c\" => تطبیق فشرده شدن دکمه Ctrl به همراه دکمه دیگر
مثال: cZ\ بررسی فشرده شدن کلیدهای Ctrl و Z درمتن - البته همه زبان های برنامه نویسی پشتیبانی این متاکاراکتر را پشتیبانی نمی کنند.
تطبیق یک یا چند کارکتر
"+" => متاکارکتر + تطبیق یک یا تعداد نامحدودی از کارکتر ها (حداقل یک کارکتر باید وجود داشته باشد.)
مثال: برای تطبیق یک یا چند کاراکتر (یا یک مجموعه از کاراکترها که بین [ و ] قرار میگرند) => +[9-0]

نکته کلی مهم:

اگر متا کارکتر هایی مانند "+" درون مجموعه (بین [ و ] ) قرار دهید به معنای خود کاراکتر می باشد. به عبارت دیگر [+9-0] به معنای تطبیق یک عدد و یا کاراکتر + میباشد. درواقع درون [ و ] نیازی به Escape character نیست، هرچند اگر Escape character قرار دهید هم مشکلی ایجاد نمیکند. (شخصا پیشنهاد میکنم با Escape character بنویسید.)

تطبیق صفر یا چند کاراکتر
"*" => مانند متاکاراکتر "+" با این تفاوت که، صفر یا تعداد بیشتری از کاراکترها یا اعضای یک مجموعه را بررسی میکند.
تطبیق صفر یا یک کاراکتر
"?" => مانند متاکاراکتر "+" با این تفاوت که، برای بررسی وجود یک یا صفر کاراکتر استفاده میشود. کاربر مهم این متاکاراکتر بررسی صحت وجود یک کاراکتر اختیار است.
تعیین دقیق دفعات تکرار (Intervals)
"{" و "}" => بین متاکاراکتر "{" و "}" عدد تعداد دفعات تکرار قرار میگیرد. به عنوان مثال {3} و در جلوی کاراکتر یا مجموعه ای از کارکترها (جلوی عبارت باقاعده) قرار میگیرند، اگر آن عبارت دقیقا با تعداد دفعات تکرار برابر بود مورد تطبیق قرار میگیرد در غیر این صورت موردی تطبیق داده نمیشود.
مثال: {4}[9-7] => در متن دقیقا 4 مرتبه یکی از عداد 7 ، 8 یا 9 (پشت سرهم) باید وجود داشته باشند.به عبارت دیگر هر عدد 4 رقمی که تمامی رفم های آن از 7 یا 8 یا 9 تشکیل شده را تطبیق بده.
تعیین حداقل و حداکثر تعداد دفعات تکرار (Intervals)
استفاده از "{" و "}" به صورت {n,m} => به معنای n حداقل و m حداکثر تعداد دفعات تکرار.
مشاهده مثال
نکته: با صفر نیز میتوان شروع شود. مثال {0,3} به معنای تطبیق صفر یا یک یا دو یا سه کاراکتر یا مجموعه است.
تعیین حداقل تعداد دفعات تکرار (Intervals)
استفاده از "{" و "}" به صورت {,n} => به معنای n حداقل تعداد دفعات تکرار.
نکته: حتما "," قرار دهید. در غیر این صورت همان "تعیین دقیق دفعات تکرار" هست !
مشاهده مثال
نکته: متاکاراکتر"+" معادل {,1} است.
جلوگیری از تطبیق اضافه
تنبل کردن متاکاراکترهای حریض * و + {,n} با استفاده از متا کاراکتر ? برای جلوگیری از تطبیق اضافه.
?* و ?+ و ?{,n}
مشاهده مثال متاکاراکترهای حریص<br/>مشاهده مثال متاکاراکترهای تنبل
نکته: متاکاراکترهای حریص همیشه به دنبال بیشترین میزان قابل تطبیق در متن است. در مقابل متاکاراکترهای تنبل همیشه به دنبال کمترین میزان تطبیق در متن هستند.
نشانه گذارهای کلمه (تطبیق مکانی)
برای تشخیص و تطبیق ابتدا و انتهای یک کلمه استفاده می شود.
"b\" => برای مشخص کردن یک کلمه به صورت مجزا (و نه به عنوان بخشی از یک کلمه ی دیگر)
مشاهده مثال تطبیق ابتدای کلمه عبارت باقاعدهb\
مشاهده مثال تطبیق کلمه کامل ویا ابتدا و انتهای کلمه (تطبیق کلمه) b\عبارت باقاعدهb\
مشاهده مثال تطبیق انتهای کلمه b\عبارت باقاعده

"B/" => برخلاف b/ - نکته کلی که پیشتر گفته شد را بیاد آورید!
عبارت باقاعدهB\ => هرجا بجز ابتدای کلمه
B\عبارت باقاعدهB\ => هرجا بجز ابتدا و انتها کلمه
B\عبارت باقاعده => هرجا بجز انتهای کلمه
نشانه گذارهای رشته (تطبیق مکانی)
برای تشخیص و تطبیق ابتدا و انتهای کل رشته استفاده می شود.
"^" برای تطبیق ابتدای کل رشته
"$" برای تطبیق انتهای کل رشته
مثال: عبارت باقاعده^ => به معنای تطبیق ابتدای رشته
مثال: $عبارت باقاعده => به معنای تطبیق انتهای رشته
نکته مهم:
متاکاراکتر "^" اگر در بین [ و ] ابتدای آن بیاید به معنای بجز است (پیشتر گفته شد). اگر ابتدای عبارت با قاعده بیاید به معنای ابتدای رشته است.
(تطبیق مکانی)
استفاده از حالت چند خطی - MultiLine (تطبیق مکانی) همه زبان ها پشتیبانی نمی کنند.
"(m?)" => کاراکترهای "r\n\" به عنوان فاصله در نظر میگیرد. به عبارت دیگر متون واقع در ابتدا و انتهای یک خط جدید را نیز تطبیق می دهند.

استفاده از حالت تک خطی - SingleLine (تطبیق مکانی) همه زبان ها پشتیبانی نمی کنند.
"(s?)" => کاراکترهای خط جدید و شکستگی خط را به لیست کاراکترهایی که می توانند توسط متاکاراکتر"." تشخیص دهد اضافه میکند.(برعکس "(m?)").

استفاده در هر دو حالت همزمان:
استفاده به صورت (m)(?s?) ویا بطور مختصر (ms?)
توضیحات بیشتر
دسته بندی عبارات باقاعده با زیرعبارت ها
متاکاراکترهای "(" و ")" => برای دسته بندی کردن و ایجاد یک موجودیت جدید بکار گرفته میشوند.
نکته: برای خوانایی بیشتر نیز می توان از زیرعبارت ها نیز استفاده کرد.
مثال بدون استفاده از "("و")"
مثال با استفاده از "("و")"
نکته: "("و")" قابلیت استفاده تو در تو نیز دارند.
نکته: یکی از کاربردهای اصلی زیرعبارت ها، کنترل تعداد تکرار مجموعه ای از کاراکترها است.
متا کاراکتر "یا"
"|" =>این متا کارکتر بصورت "یا" عمل میکند.
عبارت با قاعده دیگر (عبارت با قاعده راست | عبارت با قاعده چپ) برای دقیق بودن عبارت ما از "("زیرعبارت")" استفاده کردیم.
"("و")" در این مثال پاک کنید و نتیجه را مشاهده کنید!
تطبیق از طریق ارجاع به عقب با زیرعبارت ها
"عدد\(زیرعبارت)" => "عدد\" این بخش ارجاع به عقب به عبارت قرار گرفته شده بین "("و")" است، و عدد آن مشخص کننده تطبیق کدام زیرعبارت است.
به عنوان مثال "1\" اولین زیرعبارت موجود در عبارت باقاعده را تطبیق میدهد."2\" دومین زیرعبارت را تطبیق میدهد و "3\" سومین زیرعبارت را تطبیق میدهد و ... .

نکته: می توان قابیلت ارجتع به عقب را به عنوان وجود یک متغییر موقت برای ذخیره ی مقدار یافت شده ی قبلی درنظر گرفت.

نکته: ارجاع به عقب در #C - کلاس match که شامل یک خاصیت با نام Groups است که مجموعه ای از موارد تطبیق شده را برگشت میدهد. به عنوان مثال : match.Groups[1] اولین مجموعه ی تطبیق شده را بر میگرداند.

نکته: قابلیت ارجاع به عقب تنها در صورتی کار می کند که عبارتی که به آن مراجعه می شود یک زیرعبارت، یعنی عبارت باقاعده قرار گرفته بین "("و")" باشد.

نکته: ارجاع به عقب از "1\" شروع میشود ولی در برخی از زبان ها از 0 نیز میتواند قرار بگیرد که 0 به معنای ارجاعی به کل عبارت است.
جایگزاری (در زبان های مختلف روش های متفاوتی دارد)
نکته: ارجاع به عقب و زیرعبارت ها، از اجزای اصلی در عملیات جایگزاری هستند.

در #C از کلاس Replace() برای عملیات جایگزاری عبارت در رشته با توجه به عبارت باقاعده استفاده میشود.

نکته: وقتی که قصد تغییر قالب عبارتی از شکلی به شکل دیگر را دارید بهتر است اجزای مختلف عبارت باقاعده را با استفاده از زیرعبارت ها به قسمت های کوچکتری تقسیم کنید تا کنترل بیشتری بر روی نتیجه ی نهایی داشته باشید.

تبدیل حروف کوچک و بزرگ (در بعضی زبان ها پشتیبانی میشود)
"E\" => در صورتی که متاکاراکترهای L\ و U\ قبل از این متاکاراکتر وجود داشته باشند، عملکرد آنها را خنثی می کند.
"l\" => کاراکتر یا عبارت بعد از خود را به حروف کوچک تبدیل میکند.
"L\" => تمامی کاراکترهای بعد از خود را تا زمانی که به متاکاراکتر E\ برسد به حروف کوچک تبدیل میکند.
"u\" => کارکتر یا عبارت بعد از خود را به حروف بزرگ تبدیل میکند.
"U\" => تمامی کاراکترهای بعد از خود را تا زمانی که به متاکاراکتر E\ برسد به حروف بزرگ تبدیل میکند.
نگاه به جلو و عقب Lookaround

نگاه به جلو - Lookahead: الگویی را در عبارت باقاعده تعیین میکند آما آن الگو به عنوان جزئی از موارد یافت شده برگشت داده نمیشود. برای ایجاد چنین عبارتی، باید آن را به عنوان یک زیرعبارت مشخص کرده و پیشوند آن را برابر با "=?" قرار دهیم. به عبارت دیگر، به راحتی میتوان هر زیرعبارتی را با قرار دادن "=?" در ابتدای آن قابلیت نگاه به جلو بخشید.
مشاهده مثال نگاه به جلو
مشاهده مثال بدون نگاه به جلو
نکته: در یک عبارت باقاعده میتوان از چندین زیرعبارت با قابلیت نگاه به جلو استفاده کرد و این زیرعبارت ها را در هرجایی در عبارت باقاعده قرار داد.

نگاه به عقب - Lookbehind: الگویی را در عبارت باقاعده تعیین میکند آما آن الگو به عنوان جزئی از موارد یافت شده برگشت داده نمیشود. برای ایجاد چنین عبارتی، باید آن را به عنوان یک زیرعبارت مشخص کرده و پیشوند آن را برابر با "=>?" قرار دهیم. به عبارت دیگر، به راحتی میتوان هر زیرعبارتی را با قرار دادن "=>?" در ابتدای آن قابلیت نگاه به عقب بخشید. (درست برعکس نگاه به جلو)
مشاهده مثال نگاه به عقب
مشاهده مثال بدون نگاه به عقب

نگاه به عقب: عبارت "=?" به "بعد" از یک کارکتر یا گروهی از آنها نگاه کرده و در صورت تطبیق، آن را شناسایی میکند اما آن را به عنوان نتیجه برگشت نمیدهد.
نگاه به جلو: عبارت "=>?" به "قبل" از یک کاراکتر یا گروهی از آنها توجه میشود و در صورت تطبیق، آن را شناسایی میکند اما آن را به عنوان نتیجه برگشت نمیدهد.

نکته: برای بخاطر سپردن راحتتر "=>?" کاراکتر ">" نگاه به عقب است و اگر آن را حذف کنیم نگاه به جلو است("=?")

نکته مهم: زیرعبارتی که (زیرعبارت نه کل عبارت باقاعده) قابلیت نگاه به جلو بر روی آن عمل میکند، متغیر و شامل متاکاراکترهای "."و"+" باشد اما این حالت برای قابلیت نگاه به عقب وجود ندارد و این محدودیتی است که تمامی زبان های برنامه نویسی برای قابلیت نگاه به عقب قائل هستند.

ادغام قابلیت نگاه به عقب و نگاه به جلو
این دو قابلیت را میتوان در یک عبارت باقاعده با همدیگر بکاربرد.
مثال استفاده هم زمان و بدست آوردن مقدار تگ H1

عکس نگاه به جلو و عکس نگاه به عقب
"!?" => عکس نگاه به جلو یعنی "=?"
"!>?" => عکس نگاه به عقب یعنی "=>?"
نکته: برای برعکس کردن فقط کافیست بجای "=" از "!" استفاده کنید.

اطلاعات بیشتر
عبارت شرطی (فقط در برخی زبان های پشتیبانی میشوند)
برای تعریف عبارت شرطی از "?" استفاده میشود.
نمونه های شرطی که قبلا معرفی شدند:
اگر کارکتر یا مجموعه ای وجود داشت، کاراکتر "?" آن را تطبیق میدهد.
اگر عبارت پیش رو یا پشت "=?" و "=>?" در قابلیت های نگاه به جلو و عقب در متن وجود دشات، تطبیث پیدا میکند.

انواع عبارات شرطی:
عبارت شرطی بر مبنای ارجاع به عقب
عبارت شرطی بر مبنای نگاه به جلو و عقب

شرط در ارجاع به عقب: ارجاع به یک عبارت در صورتی انجام میشود که جستجوی قبلی یک زیرعبارت با موفقیت انجام شده باشد. با دستور (backreference)true)?)
"?" شروع شرط را مشخص میکند "(backrefrence)" که باید حتما درون پرانتز باشد ، یک ارجاع به عقب است که در صورتی که ارجاع به عقب تطبیق پیدا کند بخش true اجرا خواهد شد.
برای درک بهتر دستور بالا شبیه به دستور زیر در سی شارپ است:
if(backrefrence)
true
true در بالا را یک قطع کد سی شارپ در نظر بگیرید.
دستور کامل تز از دستور بالاتر نیز وجود دارد که در واقع بخش else به شرط اضافه میکند:
(backreference)true|false)?) که معادل کد سی شارپ زیر است:
if(blackrefrence)
true
else
false

شرط در نگاه به جلو و عقب:عبارات باقاعده در صورتی تطبیق داده میشوند که هر یک از عبارات در نگاه به جلو و عقب تطبیق داده شوند. دستور مانند عبارت شرطی در ارجاع به عقب است با این تفاوت که عدد درون پرانتز که معرف زیر عبارتی است که ارجاع به آن صورت میگیرد با یک عبارت به فرم نگاه به جلو و عقبجایگزین میشود.



کلاس Regular Expression در #C

  • متد IsMatch(): برای بررسی تطبیق وجود یک عبارت در یک رشته با توجه به الگوی عبارت باقاعده استفاده میشود.
  • متد Match(): همانند متد IsMath() رفتار میکند با این تفاوت که در صورت یافتن اولین نتیجه، یک کلاس از نوع Match حاوی اطلاعات عبارت پیدا شده را برگشت میدهد.
  • متد Matches(): مجموعه ای از تمامی عبارت تطبیق شده با عبارت باقاعده را به عنوان یک کلاس MatchCollection برگشت میدهد.
  • متد Replace(): برای عملیات جایگزاری عبارت در رشته با توجه به عبارت باقاعده استفاده میشود.
  • متد Split(): آرایه ای رشته ای را بر میگرداند. خانه های این آرایه با توجه به عبارت باقاعده و موارد یافت شده در رشته پر میشوند.

منبع برای Regex در سی شارپ

منبع و خرید کتاب

regexregular expression
یک برنامه نویس که هرآنچه را که یاد میگیرد در دفترچه یادداشت ویرگولیش یادداشت میکرد(!) حتی یک خط ! تا درصورت نیاز به آن رجوع کند...
شاید از این پست‌ها خوشتان بیاید