RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 1 اصل اینجا در قسمت آخر ما بر ساده ترین عبارات منظم تسلط یافتیم و قبلاً چیزی یاد گرفته ایم. در این قسمت به بررسی طرح های کمی پیچیده تر می پردازیم، اما باور کنید، آنقدر که به نظر می رسد دشوار نخواهد بود. پس بیایید ادامه دهیم!
مرحله 8: ستاره
تا کنون، کم و بیش فقط توانسته ایم رشته هایی با طول مشخص را مطابقت دهیم. اما در جدیدترین مشکلات، به محدودیت کاری که میتوانیم با نمادهایی که تاکنون دیدهایم نزدیک شدهایم. به عنوان مثال فرض کنید که ما محدود به شناسه های 3 کاراکتری جاوا نیستیم، بلکه می توانیم شناسه هایی با هر طولی داشته باشیم. راه حلی که ممکن است در مثال قبلی کار کند در مثال زیر کار نخواهد کرد:
مرحله 9: علامت سوال "اختیاری".
آیا قبلاً برای حل آخرین مشکل regex نوشته اید؟ کار کرد؟ حالا سعی کنید آن را در اینجا اعمال کنید:
مرحله 10: علامت "یا".
در مرحله 8، ما در یافتن انواع مختلف اعداد ممیز شناور با مشکل مواجه شدیم:
مرحله 8: ستاره *
و علامت پلاس+
تا کنون، کم و بیش فقط توانسته ایم رشته هایی با طول مشخص را مطابقت دهیم. اما در جدیدترین مشکلات، به محدودیت کاری که میتوانیم با نمادهایی که تاکنون دیدهایم نزدیک شدهایم. به عنوان مثال فرض کنید که ما محدود به شناسه های 3 کاراکتری جاوا نیستیم، بلکه می توانیم شناسه هایی با هر طولی داشته باشیم. راه حلی که ممکن است در مثال قبلی کار کند در مثال زیر کار نخواهد کرد:
الگو: [a-zA-Z_$]\w\w رشته: __e $12 3 3.2 fo Bar r a23 mm ab x مسابقات: ^^^ ^^^ ^^^ ^^^( مثال ) توجه داشته باشیدوقتی یک شناسه معتبر است اما بیشتر از 3 کاراکتر دارد، فقط سه کاراکتر اول مطابقت دارند. و زمانی که شناسه معتبر باشد، اما کمتر از 3 کاراکتر داشته باشد، آنگاه regex اصلا آن را پیدا نمی کند! مشکل این است که عبارات پرانتزی
[]
دقیقاً با یک کاراکتر مطابقت دارند، همانطور که کلاسهای کاراکتری مانند \w
. این به این معنی است که هر تطابق در عبارت منظم بالا باید دقیقاً سه کاراکتر باشد. بنابراین آنطور که ما انتظار داشتیم کار نمی کند. *
شخصیت های خاص و می تواند در اینجا کمک کند +
. اینها اصلاح کننده هایی هستند که می توانند به سمت راست هر عبارت اضافه شوند تا بیش از یک بار با آن عبارت مطابقت داشته باشند. ستاره Kleene (یا "ستاره") *
نشان می دهد که نشانه قبلی باید هر تعداد بار از جمله صفر بار مطابقت داشته باشد. علامت مثبت +
نشان می دهد که باید یک یا چند بار جستجو کنید. بنابراین، عبارت قبل از آن +
اجباری است (حداقل یک بار)، در حالی که عبارت قبل *
اختیاری است، اما زمانی که ظاهر می شود، می تواند هر تعداد بار ظاهر شود. حال با این آگاهی میتوانیم عبارت منظم بالا را تصحیح کنیم:
الگو: [a-zA-Z_$]\w* رشته: __e $123 3.2 برای Barr a23mm ab x مطابقت دارد: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^ ^( مثال ) اکنون شناسه های معتبر با هر طولی را مطابقت می دهیم! بینگو! اما اگر
+
به جای استفاده از *
?
الگو: [a-zA-Z_$]\w+ رشته: __e $123 3.2 برای Barr a23mm ab x مسابقات: ^^^ ^^^^ ^^ ^^^^ ^^^^^ ^^( مثال ) ما آخرین مسابقه را از دست دادیم،
х
. این به این دلیل است که +
برای تطبیق حداقل یک کاراکتر لازم است، اما از آنجایی که عبارت پرانتز شده []
قبلی \w+
قبلاً کاراکتر را "خورده" کرده است x
، کاراکتر دیگری در دسترس نیست، بنابراین مطابقت با شکست مواجه میشود. چه زمانی می توانیم استفاده کنیم +
؟ زمانی که باید حداقل یک تطابق پیدا کنیم، اما مهم نیست که یک عبارت معین چند بار باید مطابقت داشته باشد. برای مثال، اگر بخواهیم هر عددی را که دارای یک نقطه اعشار است پیدا کنیم:
الگو: \d*\.\d+ رشته: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 مطابق: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^( مثال ) توجه داشته باشیدکه با اختیاری کردن اعداد سمت چپ نقطه اعشار، توانستیم هم 0.011 و هم 0.2 را پیدا کنیم. برای انجام این کار، باید دقیقاً یک نقطه اعشار را با
\.
و حداقل یک رقم در سمت راست نقطه اعشار را با \d+
. عبارت منظم بالا با عددی مانند مطابقت ندارد 3.
، زیرا برای مطابقت به حداقل یک رقم در سمت راست نقطه اعشار نیاز داریم.
طبق معمول، اجازه دهید چند مشکل ساده را حل کنیم:
تمام کلمات انگلیسی را در قسمت زیر بیابید.الگو: رشته: 3 به علاوه 3 شش است اما 4 به علاوه سه 7 است مسابقات: ^^^^ ^^ ^^^ ^^^ ^^^^ ^^^^^ ^^( راه حل ) تمام نمادهای اندازه فایل را در لیست زیر بیابید. اندازه فایل شامل یک عدد (با یا بدون نقطه اعشار) و به دنبال آن
KB
، یا MB
:GB
TB
الگو: رشته: 11 ترابایت 13 14.4 مگابایت 22HB 9.9 گیگابایت ترابایت 0KB مطابقت: ^^^^ ^^^^^^ ^^^^^ ^^^( راه حل )
مرحله 9: علامت سوال "اختیاری".?
آیا قبلاً برای حل آخرین مشکل regex نوشته اید؟ کار کرد؟ حالا سعی کنید آن را در اینجا اعمال کنید:
الگو: رشته: 1..3KB 5...GB ..6TB مسابقات:بدیهی است که هیچ یک از این نامگذاری ها اندازه فایل معتبری نیستند، بنابراین یک عبارت منظم خوب نباید با هیچ یک از آنها مطابقت داشته باشد. راه حلی که برای حل مشکل آخر نوشتم، حداقل تا حدی با همه آنها مطابقت دارد:
الگو: \d+\.*\d*[KMGT]B رشته: 1..3KB 5...GB .. 6TB مطابقت: ^^^^^^^^^^^^^^^( مثال ) پس مشکل چیست؟ در واقع، اگر یک نقطه اعشار وجود داشته باشد، فقط باید یک نقطه اعشار را پیدا کنیم. اما
*
اجازه می دهد هر تعداد از مسابقات، از جمله صفر. آیا راهی برای تطبیق فقط صفر بار یا یک بار وجود دارد؟ اما نه بیشتر از یک بار؟ البته دارند. "اختیاری" ?
اصلاح کننده ای است که با صفر یا یکی از کاراکترهای قبلی مطابقت دارد، اما نه بیشتر:
الگو: \d+\.?\d*[KMGT]B رشته: 1.. 3KB 5...GB .. 6TB مطابقت: ^^^ ^^^( مثال ) ما در اینجا به یک راه حل نزدیکتر هستیم، اما این چیزی نیست که ما نیاز داریم. نحوه رفع این مشکل را در چند مرحله کمی بعد خواهیم دید.
در ضمن بیایید این مشکل را حل کنیم:
در برخی از زبان های برنامه نویسی (به عنوان مثال جاوا)، برخی از اعداد صحیح و ممیز شناور (نقطه) ممکن است باl
/ L
و f
/ دنبال شوند F
تا نشان دهند که باید به عنوان طولانی / شناور (به ترتیب) به جای int/double معمولی در نظر گرفته شوند. همه اعداد "طولانی" معتبر را در خط زیر پیدا کنید:
الگو: رشته: 13 لیتر طول 2 لیتر 19 لیتر لیتر 0 منطبق: ^^^ ^^ ^^ ^( راه حل )
مرحله 10: علامت "یا".|
در مرحله 8، ما در یافتن انواع مختلف اعداد ممیز شناور با مشکل مواجه شدیم:
الگو: \d*\.\d+ رشته: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 مطابق: ^^^^^ ^^ ^^^ ^^^^ ^^^^^ ^^^^^^^الگوی بالا با اعداد دارای یک نقطه اعشار و حداقل یک رقم در سمت راست نقطه اعشار مطابقت دارد. اما چه می شود اگر بخواهیم رشته هایی مانند
0.
? (عددی در سمت راست نقطه اعشار وجود ندارد.) می توانیم یک عبارت منظم مانند این بنویسیم:
الگو: \d*\.\d* رشته: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^( مثال ) همانطور که در بالا می بینید ، این مطابق است
0.
، اما با یک نقطه نیز مطابقت دارد . .
در واقع آنچه ما سعی می کنیم با آن مطابقت دهیم دو کلاس رشته متفاوت است:
- اعداد با حداقل یک رقم در سمت راست نقطه اعشار
- اعداد با حداقل یک رقم در سمت چپ نقطه اعشار
الگو: \d*\.\d+ رشته: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^
الگو: \d+\.\d* رشته: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^می بینیم که در هیچ یک از این موارد زیر رشته های
42
, یا توسط موتور پیدا نمی شوند 5
. برای به دست آوردن نتیجه مورد نیاز، ترکیب این عبارات منظم به ما آسیبی نمی رساند. ما چگونه می توانیم به این دست پیدا کنیم؟ علامت "یا" به ما اجازه می دهد چندین دنباله ممکن از تطابق را به طور همزمان در یک عبارت منظم مشخص کنیم. همانطور که علامت "یا" به ما اجازه می دهد نویسه های منفرد جایگزین را مشخص کنیم، می توانیم عبارات چند کاراکتری جایگزین را نیز مشخص کنیم. برای مثال، اگر میخواهیم «سگ» یا «گربه» را پیدا کنیم، میتوانیم چیزی شبیه این بنویسیم: 6
.
|
[]
|
الگو: \w\w\w رشته: بدیهی است که سگ از یک گربه حیوان خانگی بهتری است . مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^( مثال ) ... اما این با تمام توالی کاراکترهای سه گانه کلاس "word" مطابقت دارد. اما "سگ" و "گربه" حتی حروف مشترکی ندارند، بنابراین کروشه ها در اینجا به ما کمک نمی کنند. در اینجا سادهترین عبارت منظمی است که میتوانیم استفاده کنیم که با هر دو و فقط این دو کلمه مطابقت دارد:
الگو: سگ| رشته گربه: بدیهی است که سگ حیوان خانگی بهتری از گربه است . مسابقات: ^^^ ^^^( مثال ) موتور عبارت منظم ابتدا سعی می کند کل دنباله را در سمت چپ کاراکتر مطابقت دهد
|
، اما اگر موفق نشد، سپس سعی می کند دنباله سمت راست کاراکتر را مطابقت دهد |
. همچنین میتوان چندین کاراکتر را |
برای تطبیق بیش از دو دنباله جایگزین به زنجیر کشید:
الگو: سگ|گربه| رشته حیوان خانگی: بدیهی است که سگ حیوان خانگی بهتری از گربه است . مسابقات: ^^^ ^^^ ^^^( مثال )
حالا بیایید یکی دو مشکل دیگر را برای درک بهتر این مرحله حل کنیم:
از علامت|
برای تصحیح عبارت منظم اعشاری بالا استفاده کنید تا نتیجه ای مانند زیر ایجاد کنید:
الگو: رشته: 0.011 .2 42 2.0 3.33 4.000 5 6 7.89012 0. . مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^( راه حل ) از علامت
|
، کلاس های کاراکتر، "اختیاری" ?
و غیره برای ایجاد یک عبارت منظم منفرد استفاده کنید که هم اعداد صحیح و هم اعداد ممیز شناور (نقطه) مطابقت داشته باشد، همانطور که در مسئله در پایان مرحله قبل توضیح داده شد (این مشکل کمی پیچیده تر، بله ;))
الگو: رشته: 42L 12 x 3.4f 6l 3.3 0F LF 0.2F 0. مطابقت: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^( راه حل ) 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 3 RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 4
GO TO FULL VERSION