افزودن پشتیبانی منظم بیان به یک ابزار Golang موجود

ساخت وبلاگ

این قسمت دوم از یک سری چهار قسمت است (برخی هنوز در حال انجام هستند). شما می توانید دیگران را در اینجا پیدا کنید:

پیش از این ، ما یک ابزار تطبیق رشته معکوس را در GO ساخته ایم ، با هدف از بین بردن سیاهههای پر سر و صدا هنگام اشکال زدایی. اولین تکرار یک یا چند کلید کلید را برای مطابقت با یک پرونده منبع پذیرفت. این برای خطوط تا حدودی استاتیک و تکراری بسیار عالی است ، اما اگر بخواهیم خطوط مطابق با یک الگوی خاص را حذف کنیم ، چه می شود؟

عبارات منظم را وارد کنید.

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

عبارات منظم چیست؟

عبارات منظم (Regex به طور خلاصه) مجموعه ای از شخصیت ها هستند که یک الگوی جستجو را مشخص می کنند. آنها توسط الگوریتم های جستجوی رشته برای شناسایی بخش مربوط به متن استفاده می شوند.

شما احتمالاً قبلاً با کارتهای وحشی آشنا هستید - از * برای نشان دادن هر تعداد شخصیت (از جمله یک رشته خالی) استفاده کنید. Regex آن را یک قدم جلوتر بردارید.

آنها به شما امکان می دهند تا به طور خاص تر الگوی مطابقت داشته باشید. شما می توانید هر شخصیتی غیر از چیزی را با استفاده از [^] جستجو کنید. شما می توانید با استفاده از ^ با استفاده از ^ ، چیزی را جستجو کنید. به همین ترتیب ، می توانید با استفاده از $ ، چیزی را جستجو کنید که با یک عبارت پایان یابد. کارهای بیشتری وجود دارد که می توانید انجام دهید ، که می توانید در اینجا بیاموزید و در اینجا تست کنید.

چرا ما اهمیت می دهیم؟

پیام های ورود به سیستم اغلب به خوبی برای مطابقت با بستر در برابر ، اما نه همیشه مناسب هستند. اگر می خواستیم خطوط ورود به سیستم را بین دو جدول زمانی خاص حذف کنیم ، مثلاً 1-4 اوت 2022؟ما می توانیم این کار را با استفاده از ابزار موجود با مطابقت زیرزمینی با تکرار خود انجام دهیم:

یا ما می توانیم الگوهایی را جستجو کنیم که مطابق با بیان منظم زیر باشد:

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

اضافه کردن عملکرد جدید

مانند مقاله قبلی ، باید در نظر بگیریم که چگونه کاربر با ویژگی جدید ارتباط برقرار خواهد کرد. به خاطر سادگی ، می توانیم فرض کنیم که کاربر مجموعه ای از بستر ها ( -کلیدها) را برای مطابقت با یا الگوی (-patte) یا هر دو تهیه می کند. این امر باعث می شود دستورالعمل ها و منطق دست زدن به خطا آسان شود - اگر نه به کلیدها و نه الگوی داده نمی شود ، شکایت کنید.

برای افزودن تطبیق الگوی معکوس ، ما باید موارد زیر را انجام دهیم:

  • Readme را به روز کنید و راهنمایی کنید
  • پرچم جدید و رسیدگی به خطا را اضافه کنید
  • کد تطبیق Regex را بنویسید
  • حلقه پردازش را به روز کنید تا بین Regex و Substring Match انتخاب کنید

راهنمای به روز شده و راهنمایی README را می توان در Repo Tool for Brevity مشاهده کرد.

پرچم جدید و رسیدگی به خطا را اضافه کنید:

از آنجا که ما ورودی های کاربر را از طریق GetUserInput () دریافت می کنیم و آن پیکربندی را در پیکربندی ذخیره می کنیم ، فقط باید این موجودات را به روز کنیم تا یک پرچم جدید اضافه کنیم. در اینجا ، ما به سادگی پرچم جدید را در خط 11 تعریف می کنیم و تأیید می کنیم که یا آن یا کلیدها در خط 19 منتقل شده است.

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

توجه داشته باشید که REGEXPR GO از برخی از عملکردها ، مانند نگاه منفی پشتیبانی نمی کند. انجام برخی از Googling سریع به نظر می رسد که پیاده سازی های مختلفی از RE2 وجود دارد که باید قابلیت های اضافی را ارائه دهد ، اما این یک اکتشاف برای زمان دیگری است.

کد تطبیق Regex را بنویسید:

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

برای ساده کردن منطق پردازش ، اجازه دهید یک گیرنده را برای پیکربندی اضافه کنیم:

Linematches () را می توان در یک نمونه پیکربندی فراخوانی کرد تا مشخص شود که آیا رشته داده شده با چیزی که در الگوی ارائه شده است مطابقت دارد یا چیزی که در کلید های کلید ارائه شده است یا خیر.

حلقه پردازش را به روز کنید

تغییر در TransformInputImpl () چیز زیادی وجود ندارد. ما می خواهیم یک پیکربندی *را به عنوان ورودی (به جای چند متغیر) بگیریم و مبادله خواهیم کرد:

یک اثر جانبی خوب از این در حال حاضر تمام منطق مطابقت خط در Linematches () گره خورده است ، که باعث می شود ترفندهای بیشتری برای پردازش واضح و متمرکز باشد.

با استفاده از ابزار

با تکیه بر مثالهای قبلی ما ، اکنون می توانیم جایگزین کنیم:

این همان کار را انجام می دهد ، اما بسیار هیجان انگیز یا جدید نیست. چگونه در مورد ما کاری انجام می دهیم:

این الگوی را می توان با استفاده از REGEX101 توضیح داد ، اما در اصل با هر خط ورودی حاوی "بزرگ" ، "تیپ" ، "بیت" یا "روشن" مطابقت دارد. در مثال/input. txt این فقط سلام جهان باقی خواهد ماند!

ما حتی می توانیم مجموعه ای از کلید های کلید و یک الگوی را در صورت تمایل تهیه کنیم!

هیچ چیز از پرونده ورودی ما باقی نمی ماند.

پیچیدن

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

گسترش بیشتر Lineremover برای پذیرش مسیری برای پرونده مقصد به عنوان یک تمرین برای خواننده باقی مانده است.

اگر repo را کلون کرده و روند فوق را دنبال کنید ، می توانید به یک تلاش جانبی سریع و بدون درد بروید تا دستان خود را کمی کثیف کنید!< SPAN> امروز ، ما یک ابزار از قبل موجود را گسترش داده ایم تا عملکرد دیگری را اضافه کنیم بدون اینکه نیاز به تغییر بیش از حد ساختار اصلی داشته باشیم. هنگام ساخت نرم افزار باید موارد استفاده فعلی را در نظر بگیریم ، اما در نظر گرفتن موارد استفاده آینده محتاطانه است. فکر کردن در مورد این مورد در مرحله طراحی و ساخت می تواند باعث شود نرم افزار با حداقل تغییرات در کد موجود گسترش یابد و بنابراین فضای کمتری برای اشکالات ، سردردها و گچ ها وجود دارد.

سیگنال های تجاری...
ما را در سایت سیگنال های تجاری دنبال می کنید

برچسب : نویسنده : محسن رضایی بازدید : <-PostHit-> تاريخ : يکشنبه 6 فروردين 1402 ساعت: 19:36