شروع رشته و انتهای لنگرهای رشته ای

ساخت وبلاگ

RegexBuddy—Better than a regular expression tutorial!

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

لنگرها نژاد متفاوتی هستند. آنها به هیچ وجه با هیچ شخصیتی مطابقت ندارند. در عوض ، آنها قبل ، بعد از یا بین شخصیت ها با یک موقعیت مطابقت دارند. از آنها می توان برای "لنگر" مسابقه regex در یک موقعیت خاص استفاده کرد. Caret ^ قبل از اولین شخصیت در رشته با موقعیت مطابقت دارد. استفاده از ^ a بهABCمسابقاتaبشر^ B مطابقت نداردABCبه هیچ وجه ، زیرا B نمی تواند درست پس از شروع رشته ، با ^ مطابقت داشته باشد. در زیر برای نمای داخلی موتور Regex مشاهده کنید.

به طور مشابه ، $ درست پس از آخرین شخصیت در رشته مطابقت دارد. C $ مسابقاتcکه درABC، در حالی که یک دلار به هیچ وجه مطابقت ندارد.

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

برنامه های مفید

هنگام استفاده از عبارات منظم در یک زبان برنامه نویسی برای اعتبارسنجی ورودی کاربر ، استفاده از لنگرها بسیار مهم است. اگر از کد استفاده می کنیدif ($ input =~m/ d+/)در یک اسکریپت Perl برای دیدن اینکه آیا کاربر شماره عدد صحیح را وارد کرده است ، حتی اگر کاربر وارد شود ، ورودی را می پذیردqsdf4ghjk، زیرا d + مطابقت دارد4بشرregex صحیح برای استفاده ^ d + $ است. از آنجا که "شروع رشته" باید قبل از مسابقه d + مطابقت داشته باشد ، و "پایان رشته" باید بلافاصله پس از آن مطابقت داشته باشد ، کل رشته باید شامل رقمی برای ^ d + $ باشد تا بتواند مطابقت داشته باشد.

برای کاربر آسان است که به طور تصادفی در یک فضا تایپ کند. هنگامی که Perl از یک خط از یک فایل متنی می خواند ، شکست خط نیز در متغیر ذخیره می شود. بنابراین قبل از اعتبارسنجی ورودی ، این کار خوب است که از فضای سفید پیشرو و پیگیری کنید.^ s + مطابقت با فضای سفید و s + $ مسابقات دنباله ای از فضای سفید. در پرل ، شما می توانید استفاده کنید$ input =~s/^ s+| s+$ // gبشراستفاده مفید از Alteation و /G به ما امکان می دهد این کار را در یک خط کد انجام دهیم.

با استفاده از ^ و $ به عنوان شروع خط و انتهای لنگرهای خط

اگر رشته ای متشکل از چندین خط دارید ، مانندخط اول nsecond(جایی که n یک خط خط را نشان می دهد) ، اغلب مطلوب است که با خطوط کار کنید ، نه کل رشته. بنابراین ، بیشتر موتورهای Regex که در این آموزش مورد بحث قرار گرفته اند ، گزینه ای برای گسترش معنای هر دو لنگر دارند.^ سپس می تواند در شروع رشته مطابقت داشته باشد (قبل از آنfدر رشته فوق) ، و همچنین بعد از هر خط شکست (بین وتs). به همین ترتیب ، $ هنوز در انتهای رشته مطابقت دارد (بعد از آخرینe) ، و همچنین قبل از هر خط وقفه (بینeوت ).

در ویرایشگرهای متنی مانند EditPad Pro یا GNU Emacs و ابزارهای Regex مانند PowerGrep ، Caret و Dollar همیشه در شروع و پایان هر خط مطابقت دارند. این امر معقول است زیرا این برنامه ها به جای رشته های کوتاه برای کار با کل پرونده ها طراحی شده اند. در Ruby و Std :: regex Caret و Dollar نیز همیشه در شروع و پایان هر خط مطابقت دارند. در تقویت آنها در شروع و پایان هر خط به طور پیش فرض مطابقت دارند. Boost به شما امکان می دهد این کار را با آن خاموش کنیدregex_constants :: no_mod_mهنگام استفاده از گرامر ECMAScript.

در سایر زبان ها و کتابخانه های برنامه نویسی که در این وب سایت مورد بحث قرار گرفته است ، شما باید صریحاً این قابلیت گسترده را فعال کنید. به طور سنتی "حالت چند خط" نامیده می شود. در پرل ، شما این کار را با اضافه کردن یک M پس از کد Regex انجام می دهید ، مانند این:m/^regex $/m ؛بشردر . NET ، لنگرگاه ها قبل و بعد از خطوط جدید هنگام مشخص کردن مطابقت دارندregexoptions. multiline، مانند درregex. match ("رشته" ، "regex" ، regexoptions. multiline).

شخصیت های Break Break

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

برای لنگرگاه ها توجه دیگری وجود دارد که CR و LF به عنوان یک جفت اتفاق می افتد و طعم Regex هر دو شخصیت را به عنوان شکستن خط رفتار می کند. Delphi ، Java و JGSoft طعم CRLF را به عنوان یک جفت غیرقابل تفکیک درمان می کنند.^ بعد از CRLF و $ مسابقات قبل از CRLF مطابقت دارد ، اما هیچ یک از وسط یک جفت CRLF مطابقت ندارد. JavaScript و XPath جفت های CRLF را به عنوان دو خط خط درمان می کنند.^ در وسط و بعد از CRLF مطابقت دارد ، در حالی که $ قبل و در وسط CRLF مطابقت دارد.

شروع دائمی رشته و انتهای لنگرهای رشته

فقط در شروع رشته مطابقت دارد. به همین ترتیب ، z فقط در انتهای رشته مطابقت دارد. این دو نشانه هرگز با شکست خط مطابقت ندارند. این در تمام طعم های Regex که در این آموزش مورد بحث قرار گرفته است ، صادق است ، حتی وقتی "حالت چند لایه" را روشن می کنید. در EditPad Pro و PowerGrep ، جایی که سرپرست و دلار همیشه در شروع و پایان خط ها مطابقت دارد ، a و z فقط در شروع و پایان کل پرونده مطابقت دارند.

JavaScript ، Posix ، XML و XPath از a و z پشتیبانی نمی کنند. برای این منظور با استفاده از سرپرست و دلار گیر کرده اید.

پسوندهای GNU به عبارات منظم POSIX از `(backtick) برای مطابقت با شروع رشته ، و '(نقل قول واحد) برای مطابقت با انتهای رشته استفاده می کنند.

رشته هایی که با یک خط خط پایان می یابد

از آنجا که Perl هنگام خواندن یک خط از یک پرونده ، رشته ای را با یک خط جدید در انتها برمی گرداند ، موتور Regex Perl قبل از شکستن خط در انتهای رشته ، حتی در صورت خاموش بودن حالت چند خط ، در موقعیت قرار می گیرد. پرل همچنین بدون در نظر گرفتن اینکه آیا این شخصیت یک خط خط است ، در انتهای رشته با $ مطابقت دارد. بنابراین ^ d + $ مسابقات123آیا رشته موضوع است123یا123 n.

بیشتر طعم های مدرن regex این رفتار را کپی کرده اند. این شامل . NET ، JAVA ، PCRE ، DELPHI ، PHP و PYTHON است. این رفتار مستقل از هرگونه تنظیماتی مانند "حالت چند خط" است.

در تمام این طعم ها به جز پایتون ، z نیز قبل از استراحت خط نهایی مطابقت دارد. اگر فقط در انتهای مطلق رشته می خواهید ، از z (حروف کوچک z به جای حروف بزرگ Z) استفاده کنید. a d + z مطابقت ندارد123 nبشر z بعد از استراحت خط مطابقت دارد ، که با کلاس شخصیت Shorthand مطابقت ندارد.

در پایتون ، z فقط در انتهای رشته مطابقت دارد. پایتون از z پشتیبانی نمی کند.

رشته هایی که با وقفه های چند خط به پایان می رسند

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

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

به داخل موتور regex نگاه می کنید

بیایید ببینیم چه اتفاقی می افتد وقتی که سعی می کنیم ^ 4 $ را مطابقت دهیم749 n486 n4(جایی که n یک شخصیت خط جدید را نشان می دهد) در حالت چند خط. طبق معمول ، موتور Regex از شخصیت اول شروع می شود:7بشراولین نشانه در بیان منظم ^ است. از آنجا که این نشانه یک نشانه به طول صفر است ، موتور سعی نمی کند آن را با شخصیت مطابقت دهد ، بلکه با موقعیت قبل از شخصیتی که موتور Regex تاکنون به آن رسیده است.^ در واقع قبل از موقعیت مطابقت دارد7بشرموتور سپس به نشانه Regex بعدی پیشرفت می کند: 4. از آنجا که نشانه قبلی به طول صفر بود ، موتور Regex به شخصیت بعدی در رشته پیشرفت نمی کند. در آن باقی مانده است7بشر4 یک شخصیت تحت اللفظی است که مطابقت ندارد7بشرهیچ مجوز دیگری از Regex وجود ندارد ، بنابراین موتور دوباره با اولین نشانه Regex ، در شخصیت بعدی شروع می شود:4بشراین بار ، ^ نمی تواند در موقعیت قبل از 4 مطابقت داشته باشد. این موقعیت قبل از یک شخصیت انجام می شود ، و آن شخصیت یک خط جدید نیست. موتور در ادامه دارد9، و دوباره شکست می خورد. تلاش بعدی ، در ، همچنین شکست می خورد. دوباره ، موقعیت قبل مقدم بر یک شخصیت است ،9، و آن شخصیت یک خط جدید نیست.

سپس ، موتور Regex به ثانیه می رسد4در رشته^ می تواند در موقعیت قبل از4، زیرا قبل از آن توسط یک شخصیت خط جدید انجام می شود. باز هم ، موتور Regex به سمت Regex Token ، 4 ، پیشرفت می کند ، اما موقعیت کاراکتر را در رشته پیشرفت نمی کند. 4 مسابقه4، و موتور هم Token Regex و هم شخصیت رشته را پیشرفت می کند. اکنون موتور سعی می کند قبل از آن (در واقع: قبل) $ در موقعیت مطابقت داشته باشد8بشردلار نمی تواند در اینجا مطابقت داشته باشد ، زیرا این موقعیت توسط یک شخصیت دنبال می شود و آن شخصیت خط جدیدی نیست.

با این حال ، دوباره موتور باید سعی کند دوباره با اولین نشانه مطابقت داشته باشد. پیش از این ، در مرحله دوم با موفقیت مطابقت داشت4، بنابراین موتور در شخصیت بعدی ادامه می یابد ،8، جایی که سرپرست مطابقت ندارد. همان در6و خط جدید

سرانجام ، موتور Regex سعی می کند با اولین نشانه در سوم مطابقت داشته باشد4در رشتهبا موفقیت. پس از آن ، موتور با موفقیت 4 را با4بشرنشانه regex فعلی به $ پیشرفته است و شخصیت فعلی به آخرین موقعیت در رشته پیشرفت می شود: خلاء بعد از رشته. هیچ نشانه ای از Regex که به یک شخصیت برای مطابقت نیاز دارد می تواند در اینجا مطابقت داشته باشد. حتی یک کلاس شخصیت نفی نیست. با این حال ، ما در حال تلاش برای مطابقت با یک علامت دلار هستیم و دلار قدرتمند یک جانور عجیب است. طول صفر است ، بنابراین سعی می کند قبل از شخصیت فعلی با موقعیت مطابقت داشته باشد. فرقی نمی کند که این "کاراکتر" بعد از رشته باطل باشد. در واقع ، دلار شخصیت فعلی را بررسی می کند. این باید یک خط جدید یا خلاء بعد از رشته باشد ، برای $ برای مطابقت با موقعیت قبل از شخصیت فعلی. از آنجا که این مورد پس از مثال اتفاق می افتد ، دلار با موفقیت مطابقت دارد.

از آنجا که $ آخرین نشانه در Regex بود ، موتور یک مسابقه موفق پیدا کرده است: آخرین4در رشته

خبرهای فارکس...
ما را در سایت خبرهای فارکس دنبال می کنید

برچسب : نویسنده : شهره لرستانی بازدید : <-PostHit-> تاريخ : شنبه 7 مرداد 1402 ساعت: 15:58