۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

Regex: پردازش الگوها در متن

عبارات منظم در بسیاری از زبان های برنامه نویسی ساخته شده اند و برای مطابقت، جستجو و تغییر الگوهای متن در برنامه های شما استفاده می شوند. با Regex شروع کنید.

عبارات منظم در بسیاری از زبان های برنامه نویسی ساخته شده اند و برای مطابقت، جستجو و تغییر الگوهای متن در برنامه های شما استفاده می شوند. با Regex شروع کنید.

بسیاری از زبان های برنامه نویسی دارای عبارات منظم یا به اختصار “regex” هستند که برای یافتن الگوها در رشته های متن استفاده می شوند. کتابخانه regex یک زبان کوچک برای توصیف الگوها است که می تواند با ابزارهای کاربردی ترکیب شود تا الگوهای موجود در متن شما را استخراج کرده و با آنها کار کند. این مقاله شما را با استفاده از عبارات منظم در برنامه های خود آشنا می کند.

نحوه عملکرد عبارات منظم

بعضی می گویند مجموعه ای از عبارات منظم شامل یک زبان خاص دامنه، یا DSL است. در اصل، یک زبان برنامه نویسی کوچک است. یک زبان برنامه نویسی کامل مانند جاوا یا پایتون می تواند کارهای زیادی انجام دهد، اما regex فقط یک کار را انجام می دهد: مطابقت متن با الگوها.

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

خواندن عبارات منظم ممکن است در یک نگاه دشوار باشد، زیرا هر شخصیت در یک regex به طور بالقوه دارای اهمیت خاصی است. به همین دلیل است که regex به عنوان یک زبان «یک بار بنویس، هرگز خوانده نشود» شهرت بدی دارد: نحو در یک نگاه مختصر و مرموز است. اما با ابزارهای مناسب، می توانید به راحتی عبارات منظم خود را توسعه دهید و عبارات نوشته شده توسط دیگران را معنا کنید.

سیستکس Regex

در اینجا یک مثال ساده از یک عبارت منظم است که در یک رشته دنباله Hello world را جستجو می کند:


Hello world

اگر فقط حروف و اعداد و فاصله های قدیمی ساده را مطابقت می دهید، تنها چیزی که برای عبارت منظم نیاز دارید متنی است که با آن مطابقت می دهید. با این حال، قدرت واقعی regex این است که می‌توانید شرایط را در regex برای ثبت الگوها تعریف کنید. برای این کار، از کاراکترهای رزرو شده خاصی استفاده خواهید کرد که معانی خاصی دارند.

گرفتن همه کاراکترها

ساده ترین مثال از یک کاراکتر با معنای خاص، نقطه است (.). در regex، نقطه به معنای “هر شخصیت” است. بنابراین یک عبارت منظم که با هر سه کاراکتر در یک ردیف مطابقت داشته باشد، ... (یا {۳} خواهد بود، زیرا یک عدد در یک {} است. /code> به معنای "آخرین چیزی که چندین بار مطابقت دارد" است).

اگر می‌خواهید یک دوره واقعی را مطابقت دهید، از \ استفاده می‌کنید. علامت معکوس قبل از هر کاراکتری در یک regex به معنای "تطابق با هر چیزی که به‌طور تحت اللفظی می‌آید." p>

گرفتن مقادیری از کاراکترها

یک نویسه خاص دیگر علامت سوال (؟) است. بر اساس زمینه، معانی مختلفی دارد، اما به طور کلی، از این کاراکتر برای نشان دادن تطابق اختیاری مورد قبلی استفاده می‌شود. به این نوع کاراکتر کمیت‌کننده می‌گویند، زیرا به regex می‌گوید چند بار با چیزی مطابقت داشته باشد.

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

این regex را در نظر بگیرید: The End\.? ? نشان می‌دهد که ما می‌خواهیم یک نقطه یا هیچ یک را ثبت کنیم. نماد مثبت (+) و ستاره (*) معانی مشابهی دارند:

  • + به معنای "یک یا چند بار با چیز قبلی مطابقت دهید."
  • * به معنای "تطابق با چیز قبلی صفر بار، یا هر تعداد بار" است.

در اینجا چند نمونه از تغییرات احتمالی در regex و آنچه که هر کدام می‌توانند ثبت کنند آورده شده است:

  • پایان\.+ با پایان.، پایان..، پایان... مطابقت دارد. code> و غیره، اما نه The End.
  • پایان\.* با پایان، پایان، پایان.. مطابقت دارد، و غیره.
  • پایان\.؟ فقط با پایان و پایان
  • مطابقت دارد.

رده‌های نویسه‌ها

اگر می‌خواهید با یکی از مجموعه‌ای از نویسه‌های ممکن مطابقت داشته باشید، از [] در کلاس کاراکتر استفاده می‌کنید. به عنوان مثال، اگر می‌خواهید همه حروف صدادار ممکن را مطابقت دهید، می‌توانید از [AEIOUaeiou] استفاده کنید.

توجه داشته باشید که یک کلاس کاراکتر به طور پیش فرض فقط با یک کاراکتر در یک موقعیت مطابقت دارد. اگر از [AEIOUaeiou] در Skypeia استفاده می‌کردیم، هر بار فقط با یک مصوت در آن رشته مطابقت داشت، نه با سه واکه در یک ردیف در پایان. برای آن، می‌خواهیم از یکی از کمیت‌کننده‌های بالا استفاده کنیم—مثلاً[AEIOUaeiou]{3}—برای تطبیق سه مصوت پشت سر هم.

همچنین می‌توانید از یک کلاس کاراکتر نفی استفاده کنید، که به معنی "گرفتن همه چیز به جز این کاراکترها است." یک کلاس نفی شده با [^ شروع می شود، بنابراین [^AEIOUaeiou] به معنای "گرفتن هر چیزی که مصوت نیست" است. این یک روش مفید برای انجام کارهایی است مانند ثبت هر چیزی که در گیومه مشخص شده است، به عنوان مثال، "[^"]*". هر کاراکتری را که یک نیست نادیده می گیرد. نقل قول می کند و ادامه می دهد تا زمانی که با یکی مواجه شود.

گروه‌ها را عکس بگیرید

داده هایی که با regex می گیرید لازم نیست همه در یک توده باشند. شما می توانید قسمت هایی از regex خود را که قرار است به عنوان عناصر ضبط شده خودشان شکسته شوند تعریف کنید. برای این کار از پرانتز، () برای نشان دادن گروه‌های گرفتن استفاده می‌کنیم.

به عنوان مثال، اگر بگوییم data:([0-9]+)، به دنبال رشته da: می‌گردد و به دنبال آن یک به هر تعداد از ارقام از ۰ تا ۹. با این حال، ارقام در گروه ضبط جداگانه خود ذخیره می شوند، که می توان از شیء مطابقی که توسط کتابخانه regex شما بازگردانده شده است، به آن دسترسی داشت.

گروه ها و منطق را ضبط کنید

گروه‌های ضبط همچنین می‌توانند برای نشان دادن مناطق منطقی یک عبارت منظم استفاده شوند. اگر از (hey)+ در یک regex استفاده کنیم، با هر تعداد از وقوع hey در یک ردیف مطابقت خواهد داشت—hey، heyhey، heyheyhey - همه به عنوان یک گروه واحد در یک شیء مطابقت.

ما همچنین می‌توانیم با استفاده از کاراکتر | به‌عنوان عملگر OR، از این ویژگی برای گرفتن یکی از تعدادی چیزهای داده شده استفاده کنیم. برای مثال، regex (hey|ho)+، hey، ho، heyho، را می گیرد. >hoheyhoho، و غیره.

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

کاراکترهای regex ویژه دیگر

برخی از کاراکترهای خاص در regex برای گرفتن انواع رایج کاراکترها استفاده می‌شوند، بنابراین لازم نیست کلاس‌های کاراکتر را دوباره برای آنها اختراع کنید:

  • \s|\S: هر نویسه فضای سفید (یا بدون فضای سفید)—فضاها، برگه‌ها، شکستگی‌های خط و غیره.
  • \d|\D: هر نویسه رقمی (یا غیر رقمی).
  • \w|\W: هر نویسه کلمه (یا غیر کلمه). یک روش مفید برای گرفتن کاراکترهایی که معمولاً با فضای خالی در دو طرف احاطه شده اند.
  • \b:\B: هر کاراکتر مرزی کلمه (یا غیرمرز کلمه). روشی مفید برای ثبت کاراکترهای یافت شده بین کلمات، مانند فضای خالی و نقطه گذاری.
  • \n: نویسه‌های خط جدید یا شکست خط. (در ویندوز، شکست خط دو کاراکتر است، \r\n.)
  • \^|\$: شروع (یا پایان) یک خط یا رشته معین را مطابقت دهید.

پرچم‌های Regex

وقتی یک عبارت معمولی را روی یک رشته اجرا می‌کنید، می‌توانید گزینه‌ها یا «پرچم‌هایی» را ارسال کنید که نحوه اجرای عبارت را تغییر می‌دهند. این‌ها اغلب تأثیرات عمده‌ای بر رفتار یک عبارت منظم دارند—گاهی اوقات، regex آنطور که می‌خواهید کار نمی‌کند مگر اینکه از یکی از آنها استفاده کنید.

توجه داشته باشید که نحوه تنظیم این پرچم ها به کتابخانه regex در حال استفاده بستگی دارد. همچنین، اینها تنها تعدادی از رایج ترین پرچم ها هستند. کتابخانه ای که استفاده می کنید ممکن است تعداد بیشتری داشته باشد.

  • Global: Regex باید روی کل رشته اعمال شود و فقط در اولین مسابقه متوقف نشود. اگر می‌خواهید تمام نمونه‌های ممکن یک مسابقه را در یک رشته ثبت کنید، باید این پرچم را فعال کنید.
  • چند خطی: وقتی تنظیم شود، \^ و \$ به جای شروع، با ابتدا یا انتهای خطوط یک رشته مطابقت دارند. یا انتهای کل رشته اگر به دنبال چندین منطبق بر روی الگویی هستید که بخشی از ساختار آن یک خط شکسته است، از این پرچم استفاده کنید.
  • Single line: این گزینه به نقطه (.) اجازه می دهد تا با خطوط جدید و همچنین سایر کاراکترها مطابقت داشته باشد. به این ترتیب، در صورت نیاز، متن ثبت شده با نقطه می‌تواند چندین شکست خط را در بر بگیرد.
  • غیرحساس به حروف کوچک: مطابقت‌ها بدون حروف بزرگ انجام می‌شوند، بنابراین حروف بزرگ و کوچک یکسان در نظر گرفته می‌شوند. اگر رشته هایی دارید که به حروف بزرگ یا کوچک عادی نشده اند مفید است.

یک مثال ساده regex

در اینجا یک regex ساده برای گرفتن URL ها وجود دارد که از بسیاری از جزئیاتی که پوشش داده ایم استفاده می کند.


(https?)://([^/]+)/([^\s]+)

اجازه دهید عنصر به عنصر regex را مرور کنیم:

  • https? به معنای "گرفتن http و در صورت اختیاری s" است. پرانتز این را در گروه ضبط خودش قرار می دهد.
  • :// کولون را می گیرد، و سپس دو اسلش رو به جلو. (توجه داشته باشید که در برخی از پیاده سازی های regex، شما باید از این اسلش ها نیز فرار کنید.)
  • ([^/]+) همه چیز را تا اولین اسلش، که نام دامنه و در صورت اختیاری پورت خواهد بود، ثبت می‌کند.
  • ([^\s]+) در گروه خود، هر کاراکتری را از آن نقطه به بعد که فضای خالی یا شکستگی خط نیست، ثبت می کند. هنگامی که regex با یک فضای خالی یا خط شکست مواجه می شود، متوقف می شود. (فاصله سفید در یک URL معتبر مجاز نیست.)

این به ما تصویری با سه گروه در آن می دهد: پروتکل (http یا https)، نام دامنه، و مسیر URL. سپس می‌توان عکس‌های به‌دست‌آمده را بیشتر پردازش کرد - یا با سایر عبارات منظم یا با کتابخانه‌های دیگر برای کارهای خاص، مانند تأیید وجود یا عدم وجود دامنه معین.

نمونه regex سعی نمی‌کند همه جایگشت‌های ممکن یک URL را پوشش دهد، فقط ابتدایی‌ترین الگوها را پوشش می‌دهد. اما عبارات منظم نباید سعی کنند هر گونه ممکنی از یک الگو را به تصویر بکشند. زمانی که برای گرفتن کلی‌ترین نسخه یک الگو استفاده می‌شوند و برای ارائه راهی راحت برای شکستن آن الگو به قسمت‌هایی که بیشتر به آن نیاز دارید، بهترین هستند.