RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. بخش 1. RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 2: در این قسمت به مواردی می پردازیم که کمی پیچیده تر هستند. اما تسلط بر آنها، مانند گذشته، دشوار نخواهد بود. تکرار میکنم که RegEx در واقع سادهتر از آن چیزی است که در ابتدا به نظر میرسد، و برای تسلط بر آن و شروع استفاده از آن در عمل، نیازی نیست که دانشمند موشکی باشید. اصل انگلیسی این مقاله اینجاست .
مرحله 11: پرانتز
در آخرین مشکل، ما به دنبال انواع مختلف مقادیر عدد صحیح و مقادیر عددی ممیز شناور (نقطه) بودیم. اما موتور بیان منظم بین این دو نوع ارزش تفاوتی قائل نشد، زیرا همه چیز در یک عبارت منظم بزرگ ثبت شده بود. اگر الگوهای کوچک خود را در پرانتز قرار دهیم، میتوانیم به موتور عبارت منظم بگوییم که بین انواع مختلف مطابقتها تفاوت قائل شود:
مرحله 13: بریس های فرفری
در مثال با نام خانوادگی مرحله قبل، 2 گروه تقریباً تکرار شونده در یک الگو داشتیم:
مرحله 14:
آخرین کار بسیار سخت بود. مرحله 15: "caret"
توالی مرزی کلمه
مرحله 11: پرانتز ()
به عنوان گروه های ضبط
در آخرین مشکل، ما به دنبال انواع مختلف مقادیر عدد صحیح و مقادیر عددی ممیز شناور (نقطه) بودیم. اما موتور بیان منظم بین این دو نوع ارزش تفاوتی قائل نشد، زیرا همه چیز در یک عبارت منظم بزرگ ثبت شده بود. اگر الگوهای کوچک خود را در پرانتز قرار دهیم، میتوانیم به موتور عبارت منظم بگوییم که بین انواع مختلف مطابقتها تفاوت قائل شود:
الگو: ([AZ])|([az]) رشته: رئیس جمهور فعلی بولیوی اوو مورالس است . مسابقات: ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ گروه: 122 2222222 122222222 22 1222222 22 122 1222222( مثال ) عبارت منظم بالا دو گروه ضبط را تعریف می کند که از 1 ایندکس می شوند. گروه ضبط اول با هر حرف بزرگ منطبق می شود و گروه ضبط دوم با هر حرف کوچک منطبق می شود. با استفاده از علامت "یا"
|
و پرانتزها ()
به عنوان یک گروه تصویربرداری، میتوانیم یک عبارت منظم را تعریف کنیم که با انواع رشتهها مطابقت دارد. اگر ما این را به regex جستجوی طولانی / شناور از قسمت قبلی مقاله اعمال کنیم، موتور regex مطابقت های مربوطه را در گروه های مناسب ضبط می کند. با بررسی اینکه یک زیررشته با کدام گروه مطابقت دارد، می توانیم بلافاصله تعیین کنیم که آیا مقدار شناور است یا یک مقدار طولانی:
الگو: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) رشته: 42L 12 x 3.4f 6l 3.3 0F LF .2F 0. مسابقات: ^^^ ^^^^ ^^ ^^ ^^^ گروه: 222 1111 22 11 111( مثال ) این عبارت منظم کاملاً پیچیده است و برای درک بهتر آن، اجازه دهید آن را تجزیه کرده و به هر یک از این الگوها نگاه کنیم:
( // با هر زیررشته "float" مطابقت دارد \d*\.\d+[fF] | \d+\.\d*[fF] | \d+[fF] ) | //یا ( // با هر زیر رشته "طولانی" مطابقت دارد \d+[lL] )علامت
|
و گروه های گرفتن در پرانتز ()
به ما اجازه می دهد تا انواع مختلف زیررشته ها را مطابقت دهیم. در این مورد، ما یا اعداد ممیز شناور «شناور» یا اعداد صحیح بلند «طولانی» را مطابقت می دهیم.
( \d*\.\d+[fF] // 1+ رقم در سمت راست نقطه اعشار | \d+\.\d*[fF] // 1+ رقم در سمت چپ نقطه اعشار | \d+[fF] // بدون نقطه، فقط 1+ رقم ) | ( \d+[lL] // بدون نقطه، فقط 1+ رقم )در گروه ضبط "شناور" سه گزینه داریم: اعداد با حداقل 1 رقم در سمت راست اعشار، اعداد با حداقل 1 رقم در سمت چپ نقطه اعشار و اعداد بدون اعشار. هر یک از آنها تا زمانی که حروف "ف" یا "ف" به انتها اضافه شده باشند "شناور" هستند. در داخل گروه ضبط طولانی، ما فقط یک گزینه داریم - باید 1 یا چند رقم و به دنبال آن کاراکتر "l" یا "L" داشته باشیم. موتور عبارت منظم به دنبال این زیررشتهها در یک رشته معین میگردد و آنها را در گروه ضبط مناسب فهرست میکند. توجه داشته باشیدکه ما با هیچ یک از اعدادی که هیچ یک از "l"، "L"، "f" یا "F" به آنها اضافه نشده است مطابقت نمی دهیم. این اعداد را چگونه باید طبقه بندی کرد؟ خوب، اگر آنها یک نقطه اعشار داشته باشند، زبان جاوا به طور پیش فرض "دو" است. در غیر این صورت آنها باید "int" باشند.
بیایید آنچه را که آموخته ایم با چند پازل تلفیق کنیم:
دو گروه ضبط دیگر را به regex بالا اضافه کنید تا اعداد double یا int را نیز طبقه بندی کند. (این یک سوال پیچیده دیگر است، اگر مدتی طول کشید ناامید نشوید، به عنوان آخرین راه، راه حل من را ببینید.)الگو: رشته: 42L 12 x 3.4f 6l 3.3 0F LF .2F 0. مطابقت: ^^^ ^^ ^^^^ ^^ ^^^ ^^ ^^^ ^^ گروه: 333 44 1111 33 222 11 111( راه حل ) مشکل بعدی کمی ساده تر است. از گروههای ضبط پرانتزی
()
، علامت «یا» |
و محدوده کاراکترها برای مرتبسازی سنهای زیر استفاده کنید: «نوشیدنی قانونی در ایالات متحده». (>= 21) و "در ایالات متحده آمریکا مجاز به نوشیدن نیست" (<21):
الگو: رشته: 7 10 17 18 19 20 21 22 23 24 30 40 100 120 مسابقات : 22 22 22 22 22 11 11 11 11 11 11 111 111( راه حل )
مرحله 12: ابتدا موارد خاص تر را شناسایی کنید
اگر سعی میکردید «نوشیدنیهای قانونی» را بهجای گروه دوم، بهعنوان اولین گروه دستگیری تعریف کنید، ممکن است با آخرین کار مشکلی داشته باشید. برای درک دلیل، اجازه دهید به مثال دیگری نگاه کنیم. فرض کنید میخواهیم نامهای خانوادگی کمتر از ۴ کاراکتر و نامهای خانوادگی حاوی ۴ کاراکتر یا بیشتر را جداگانه ضبط کنیم. بیایید نام های کوتاه تری را برای اولین گروه ضبط کنیم و ببینیم چه اتفاقی می افتد:الگو: ([AZ][az]؟[az]؟)|([AZ][az][az][az]+) رشته: Kim Job s Xu Clo yd Moh r Ngo Roc k. مسابقات: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ گروه: 111 111 11 111 111 111 111( مثال ) به طور پیش فرض، بیشتر موتورهای عبارت منظم از تطبیق حریصانه در برابر کاراکترهای اصلی که تاکنون دیده ایم استفاده می کنند. این بدان معناست که موتور بیان منظم طولانیترین گروهی را که هرچه زودتر در عبارت منظم ارائه شده تعریف شده است، ضبط میکند. بنابراین، در حالی که گروه دوم بالا میتوانست شخصیتهای بیشتری را در نامهایی مانند «Jobs» و «Cloyd» ثبت کند، اما از آنجایی که سه کاراکتر اول این نامها قبلاً توسط اولین گروه ضبط شده بودند، نمیتوان آنها را دوباره توسط گروه دوم ضبط کرد. . حالا بیایید یک اصلاح کوچک انجام دهیم - به سادگی ترتیب گروه های ضبط را تغییر دهید و ابتدا گروه خاص تر (طولانی تر) را قرار دهید:
الگو: ([AZ][az][az][az]+)|([AZ][az]؟[az]?) رشته: کیم جابز Xu Cloyd Mohr Ngo Rock . مسابقات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ گروه: 222 1111 22 11111 1111 222 1111( مثال )
وظیفه... این بار فقط یکی :)
الگوی "ویژه تر" تقریباً همیشه به معنای "طولانی تر" است. فرض کنید میخواهیم دو نوع "کلمه" پیدا کنیم: اول آنهایی که با مصوت شروع میشوند (به طور خاص)، سپس آنهایی که با مصوت شروع نمیشوند (هر کلمه دیگری). سعی کنید یک عبارت منظم بنویسید تا رشتههایی را که با این دو گروه مطابقت دارند، ضبط و شناسایی کنید. (گروه های زیر به جای شماره گذاری، حروف هستند. شما باید تعیین کنید که کدام گروه باید با گروه اول و کدام گروه دوم مطابقت داشته باشد.)الگو: رشته: pds6f uub 24r2gp ewqrty l ui_op مطابق: ^^^^^ ^^^ ^^^^^^ ^^^^^^^^^^^^^^ گروه: NNNNN VVV( راه حل ) به طور کلی، هرچه عبارت منظم شما دقیق تر باشد، پایان آن طولانی تر خواهد بود. و هر چه دقیقتر باشد، احتمال اینکه چیزی را که به آن نیاز ندارید، بگیرید کمتر است. بنابراین اگرچه ممکن است ترسناک به نظر برسند، رژکس های طولانی تر ~= رژکس های بهتر. متاسفانه .
مرحله 13: بریس های فرفری {}
برای تعداد مشخصی از تکرارها
در مثال با نام خانوادگی مرحله قبل، 2 گروه تقریباً تکرار شونده در یک الگو داشتیم:
الگو: ([AZ][az][az][az]+)|([AZ][az]؟[az]?) رشته: کیم جابز Xu Cloyd Mohr Ngo Rock . مسابقات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ گروه: 222 1111 22 11111 1111 222 1111برای گروه اول به نام خانوادگی با چهار حرف یا بیشتر نیاز داشتیم. گروه دوم باید نامهای خانوادگی را با سه حرف یا کمتر میگرفتند. آیا راه آسان تری برای نوشتن این مطلب از تکرار
[a-z]
مکرر این گروه ها وجود دارد؟ اگر از بریس های مجعد برای این کار استفاده کنید وجود دارد {}
. پرانتزهای فرفری {}
به ما اجازه میدهند که حداقل و (به صورت اختیاری) حداکثر تعداد تطابق کاراکتر یا گروه ضبط قبلی را مشخص کنیم. سه مورد استفاده وجود دارد {}
:
{X} // دقیقاً با X برابر مطابقت دارد {X,} // مطابقت دارد >= X بار {X،Y} // >= X و <= Y بار منطبق استدر اینجا نمونه هایی از این سه نحو مختلف آورده شده است:
الگو: [az]{11} رشته: humuhumunuk unukuapua'a. مسابقات: ^^^^^^^^^^^( مثال )
الگو: [az]{18،} رشته: humuhumunukunukuapua 'a. مسابقات: ^^^^^^^^^^^^^^^^^^^^^( مثال )
الگو: [az]{11,18} رشته: humuhumunukunukuap ua'a. مسابقات: ^^^^^^^^^^^^^^^^^^( مثال ) در مثال های بالا چند نکته قابل توجه است.توجه داشته باشید:. ابتدا، با استفاده از نماد {X}، کاراکتر یا گروه قبلی دقیقاً با آن عدد (X) برابر خواهد شد. اگر نویسههای بیشتری در "کلمه" (از عدد X) وجود داشته باشد که میتواند با الگوی مطابقت داشته باشد (همانطور که در مثال اول نشان داده شده است)، آنها در مطابقت گنجانده نمیشوند. اگر تعداد کاراکترها کمتر از X باشد، تطابق کامل ناموفق خواهد بود (سعی کنید 11 را به 99 در مثال اول تغییر دهید). دوم، نمادهای {X,} و {X,Y} حریص هستند. آنها سعی میکنند تا حد ممکن کاراکترها را مطابقت دهند و در عین حال بیان منظم دادهشده را برآورده کنند. اگر {3،7} را مشخص کنید، 3 تا 7 کاراکتر را می توان مطابقت داد و اگر 7 کاراکتر بعدی معتبر باشد، همه 7 کاراکتر مطابقت داده می شوند. اگر {1،} را مشخص کنید و تمام 14000 کاراکتر بعدی مطابقت داشته باشند، تمام 14000 نویسه در رشته مربوطه گنجانده خواهد شد. چگونه می توانیم از این دانش برای بازنویسی عبارت فوق استفاده کنیم؟ سادهترین پیشرفت ممکن است جایگزینی گروههای همسایه
[a-z]
با [a-z]{N}
، باشد که N بر این اساس انتخاب میشود:
الگو: ([AZ][az]{2}[az]+)|([AZ][az]؟[az]؟)
... اما این اوضاع را خیلی بهتر نمی کند. به اولین گروه ضبط نگاه کنید: ما [a-z]{2}
(که دقیقاً با 2 حرف کوچک مطابقت دارد) و به دنبال آن [a-z]+
(که با 1 یا چند حرف کوچک مطابقت دارد) داریم. میتوانیم با درخواست 3 یا بیشتر حروف کوچک با استفاده از بریسهای فرفری این کار را ساده کنیم:
الگو: ([AZ][az]{3,})|([AZ][az]؟[az]؟)
گروه دوم دستگیری متفاوت است. ما به بیش از سه کاراکتر در این نامهای خانوادگی نیاز نداریم، یعنی حد بالایی داریم، اما حد پایین ما صفر است:
الگو: ([AZ][az]{3,})|([AZ][az]{0,2})
مشخص بودن همیشه هنگام استفاده از عبارات منظم بهتر است، بنابراین عاقلانه است که در اینجا توقف کنیم، اما من نمی توانم توجه نکنم که این دو محدوده کاراکتر ( [AZ]
و [az]
) در کنار یکدیگر تقریباً شبیه یک کلاس "کاراکتر کلمه" هستند، \w
( [A-Za-z0-9_]
) . اگر مطمئن بودیم که دادههای ما فقط شامل نامهای خانوادگی با فرمت مناسب است، میتوانیم عبارت معمولی خود را ساده کنیم و به سادگی بنویسیم:
الگو: (\w{4,})|(\w{1,3})
گروه اول هر دنباله ای از 4 یا بیشتر "شخصیت کلمه" ( [A-Za-z0-9_]
) را می گیرد و گروه دوم هر دنباله ای از 1 تا 3 "نویسه کلمه" (شامل) را می گیرد. آیا این کار خواهد کرد؟
الگو: (\w{4,})|(\w{1,3}) رشته: Kim Jobs Xu Cloyd Mohr Ngo Rock . مسابقات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ گروه: 222 1111 22 11111 1111 222 1111( مثال ) کار کرد! در مورد این رویکرد چطور؟ و بسیار تمیزتر از مثال قبلی ما است. از آنجایی که اولین گروه ضبط با همه نامهای خانوادگی با چهار یا بیشتر کاراکتر مطابقت دارد، حتی میتوانیم گروه دوم را به سادگی تغییر دهیم
\w+
، زیرا این به ما امکان میدهد همه نامهای خانوادگی باقیمانده (با 1، 2 یا 3 کاراکتر) را ثبت کنیم:
الگو: (\w{4,})|(\w+) رشته: Kim Jobs Xu Cloyd Mohr Ngo Rock . مسابقات: ^^^ ^^^^ ^^ ^^^^^ ^^^^ ^^^ ^^^^ گروه: 222 1111 22 11111 1111 222 1111( مثال )
بیایید به مغز کمک کنیم این را یاد بگیرد و 2 مشکل زیر را حل کند:
{}
برای بازنویسی عبارت منظم جستجوی شماره تامین اجتماعی از مرحله 7 از پرانتزهای فرفری استفاده کنید :
الگو: رشته: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B مسابقات: ^^^^^^^^^^^( راه حل ) فرض کنید برای بررسی قدرت رمز عبور یک وب سایت، رمزهای عبور کاربر باید بین 6 تا 12 کاراکتر باشد. یک عبارت منظم بنویسید که رمزهای عبور نامعتبر را در لیست زیر پرچم گذاری کند. هر رمز عبور برای تطبیق آسان در پرانتز قرار دارد
()
، بنابراین مطمئن شوید که عبارت منظم با نویسه های تحت اللفظی (
و )
نمادین شروع و پایان می یابد. نکته: مطمئن شوید که پرانتز تحت اللفظی را در گذرواژههای با [^()]
یا مشابه مجاز نمیدانید، در غیر این صورت در نهایت با کل رشته مطابقت خواهید داشت!
الگو: رشته: (12345) (رمز عبور من) (Xanadu.2112) (su_do) (OfSalesmen!) مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^( راه حل )
مرحله 14: \b
علامت مرزی با عرض صفر
آخرین کار بسیار سخت بود. ""
اما اگر با قرار دادن گذرواژهها به جای پرانتز، کار را کمی پیچیدهتر کنیم، ()
چه؟ آیا می توانیم با جایگزین کردن همه کاراکترهای پرانتز با کاراکترهای نقل قول، راه حل مشابهی بنویسیم؟
الگو: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" string: "12345" "my password" "Xanadu.2112 " " su_do" " OfSalesmen! " مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^( مثال ) خیلی چشمگیر نشد. آیا قبلاً حدس زده اید که چرا؟ مشکل اینجاست که ما در اینجا به دنبال رمزهای عبور نادرست هستیم. "Xanadu.2112" رمز عبور خوبی است، بنابراین وقتی regex متوجه میشود که این دنباله حاوی فاصله یا نویسههای تحت اللفظی نیست
"
، درست قبل از نویسهای "
که گذرواژه را در سمت راست واجد شرایط میکند، نمایش داده میشود. (زیرا مشخص کردیم که کاراکترها را "
نمی توان در رمزهای عبور با استفاده از .) پیدا کرد [^"]
. هنگامی که موتور عبارات معمولی مطمئن شد که آن کاراکترها با یک عبارت منظم خاص مطابقت ندارند، دوباره اجرا می شود، دقیقاً همان جایی که متوقف شد - جایی که کاراکتر بود "
. که محدود می کند " Xanadu.2112" در سمت راست. از آنجا او یک شخصیت فضایی و یک شخصیت دیگر را می بیند "
- برای او این رمز عبور اشتباه است! اصولاً این سکانس را پیدا می کند " "
و جلو می رود. این اصلاً چیزی نیست که ما دوست داریم ... خیلی خوب است اگر مشخص کنیم اولین کاراکتر رمز عبور نباید فاصله باشد. آیا راهی برای این کار وجود دارد؟ (تا به حال احتمالاً متوجه شده اید که پاسخ تمام سؤالات بلاغی من «بله» است.) بله! چنین راهی وجود دارد! بسیاری از موتورهای بیان منظم یک توالی فرار مانند "مرز کلمه" ارائه می دهند \b
. "مرز کلمه" \b
یک دنباله گریز با عرض صفر است که به طرز عجیبی با یک مرز کلمه مطابقت دارد. به یاد داشته باشید که وقتی می گوییم "کلمه"، به هر دنباله ای از کاراکترهای کلاس \w
یا [A-Za-z0-9_]
. تطبیق مرز کلمه به این معنی است که کاراکتر بلافاصله قبل یا بلافاصله بعد از دنباله \b
باید не
یک کاراکتر کلمه باشد. با این حال، هنگام تطبیق، این کاراکتر را در زیررشته ضبط شده خود وارد نمی کنیم. این عرض صفر است. برای اینکه ببینیم چگونه این کار می کند، اجازه دهید به یک مثال کوچک نگاه کنیم:
الگو: \b[^ ]+\b رشته: هنوز وانت زه پول ، لبوفسکی . مسابقات: ^^ ^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^( مثال ) دنباله
[^ ]
باید با هر کاراکتری که یک کاراکتر فاصله واقعی نیست مطابقت داشته باشد. ,
پس چرا این با کاما بعد از پول یا نقطه " بعد از لبوفسکی مطابقت ندارد .
؟ این به این دلیل است که کاما ,
و نقطه .
کاراکترهای کلمه نیستند، بنابراین مرزهایی بین کاراکترهای کلمه و کاراکترهای غیرکلمه ایجاد می شود. آنها بین y
انتهای کلمه ظاهر می شوند. کلمه پول و ویرگول ,
که به دنبال آن است. و بین " i
کلمه Lebowski و نقطه .
(قطع/دوره) که به دنبال آن است. عبارت منظم در مرزهای این کلمات مطابقت دارد (اما نه در کاراکترهای غیرکلمه ای که فقط به تعریف آنها کمک می کند). \b
اما اگر سازگاری را در قالب خود وارد نکنیم چه اتفاقی می افتد ؟
الگو: [^ ]+ string: Ve still vant ze money, Lebowski. مسابقات: ^^ ^^^^^ ^^^^ ^^ ^^^^^^^^^^^^^^^( مثال ) بله، اکنون این علائم نگارشی را نیز پیدا می کنیم. حالا بیایید از مرزهای کلمه برای اصلاح regex برای رمزهای عبور نقل قول استفاده کنیم:
الگو: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" string: "12345" "my password" " Xanadu. 2112" "su_do" "OfSalesmen!" مسابقات: ^^^^^^^^^^^^^^^^^^^^^^^^^^^( مثال ) با قرار دادن مرزهای کلمه در داخل گیومه ("\b ... \b")، عملاً می گوییم که اولین و آخرین کاراکتر رمزهای عبور منطبق باید "کاراکترهای کلمه" باشد. بنابراین در اینجا به خوبی کار می کند، اما اگر اولین یا آخرین نویسه رمز عبور کاربر یک کاراکتر کلمه نباشد، به خوبی کار نخواهد کرد:
الگو: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
رشته: "thefollowingpasswordistooshort" "C++"
مسابقات:
( مثال ) ببینید چگونه رمز دوم به عنوان "نامعتبر" علامت گذاری نشده است، حتی اگر به وضوح خیلی کوتاه است. شما بایدمراقب باشیدبا سکانسها \b
، زیرا آنها فقط با مرزهای بین شخصیتها مطابقت دارند \w
و نه \w
. در مثال بالا، از آنجایی که به کاراکترها اجازه ندادیم، در گذرواژهها \w
، مرز بین \
و اولین/آخرین کاراکتر رمز عبور تضمین نمیشود که یک مرز کلمه باشد \b
.
برای تکمیل این مرحله، فقط یک مشکل ساده را حل می کنیم:
مرزهای کلمات در موتورهای برجسته سازی نحوی مفید هستند، زمانی که می خواهیم دنباله خاصی از کاراکترها را مطابقت دهیم، اما می خواهیم مطمئن شویم که آنها فقط در ابتدا یا انتهای یک کلمه (یا به تنهایی) رخ می دهند. فرض کنید در حال نوشتن برجسته سازی نحو هستیم و می خواهیم کلمه var را برجسته کنیم، اما فقط زمانی که به خودی خود ظاهر شود (بدون لمس سایر کاراکترهای کلمه). آیا می توانید یک عبارت منظم برای این بنویسید؟ البته می توانید، کار بسیار ساده ای است ;)الگو: رشته: var varx _var ( var j) barvarcar * var var -> { var } مسابقات: ^^^ ^^^ ^^^ ^^^ ^^^( راه حل )
مرحله 15: "caret" ^
به عنوان "شروع خط" و علامت دلار $
به عنوان "انتهای خط"
توالی مرزی کلمه \b
(از آخرین مرحله از قسمت قبلی مقاله) تنها دنباله ویژه با عرض صفر نیست که برای استفاده در عبارات منظم موجود است. دو مورد از محبوب ترین آنها عبارتند از "caret" ^
- "ابتدای خط" و علامت دلار $
- "انتهای خط". گنجاندن یکی از این موارد در عبارات منظم به این معنی است که مطابقت باید در ابتدا یا انتهای رشته منبع ظاهر شود:
الگو: ^start|end$ string: شروع پایان شروع پایان شروع پایان شروع شروع پایان مطابقت: ^^^^^ ^^^( مثال ) اگر رشته شما دارای شکسته های خط باشد، با
^start
دنباله "شروع" در ابتدای هر خط مطابقت دارد و end$
با دنباله "پایان" در انتهای هر خط مطابقت دارد (اگرچه نشان دادن این در اینجا دشوار است). این نمادها به ویژه هنگام کار با داده هایی که حاوی جداکننده هستند مفید هستند. بیایید از مرحله 9 با استفاده از ^
"شروع خط" به موضوع "اندازه فایل" برگردیم. در این مثال، اندازه فایل های ما با فاصله های "
" از هم جدا شده اند. بنابراین ما می خواهیم که هر اندازه فایل با یک عدد شروع شود، قبل از یک کاراکتر فاصله یا شروع یک خط:
الگو: (^| )(\d+|\d+\.\d+)[KMGT]B رشته: 6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB . مسابقات: ^^^^^ ^^^^^ ^^^^^^ ^^^^ گروه: 222 122 1222 12( مثال ) ما در حال حاضر خیلی به هدف نزدیک شده ایم! اما ممکن است متوجه شوید که ما هنوز یک مشکل کوچک داریم: ما در حال تطبیق کاراکتر فاصله قبل از اندازه فایل معتبر هستیم. اکنون میتوانیم به سادگی از این گروه کپچر (1) چشم پوشی کنیم، وقتی موتور عبارت منظم ما آن را پیدا کرد، یا میتوانیم از یک گروه غیر کپچر استفاده کنیم که در مرحله بعد خواهیم دید.
در ضمن، بیایید 2 مشکل دیگر را برای تن حل کنیم:
در ادامه با مثال هایلایت نحو ما از مرحله آخر، برخی از برجسته سازی نحو، فضاهای انتهایی را مشخص می کند، یعنی هر فاصله ای که بین یک کاراکتر بدون فضای سفید و انتهای خط قرار می گیرد. آیا می توانید یک regex بنویسید تا فقط فضاهای انتهایی را برجسته کنید؟الگو:
رشته: myvec <- c(1، 2، 3، 4، 5)
مسابقات: ^^^^^^^
( راه حل ) یک تجزیه کننده ساده ارزش جدا شده با کاما (CSV) به دنبال "توکن ها" جدا شده با کاما می گردد. به طور کلی، فضا هیچ معنایی ندارد مگر اینکه در داخل گیومه قرار گیرد ""
. یک عبارت منظم تجزیهکننده CSV بنویسید که با نشانههای بین کاما مطابقت داشته باشد، اما فضای سفیدی را که بین نقلقول نیست نادیده میگیرد (نمیگیرد) .
الگو: رشته: a، "b"، "c d"،e،f، "g h"، dfgi،، k، ""، l مطابقت دارد: ^^ ^^^^ ^^^^^^^^^^ ^^^ ^^^ ^^^^^^ ^^ ^^^ ^ گروه: 21 2221 2222212121 222221 222211 21 221 2( راه حل ) RegEx: 20 گام کوتاه برای تسلط بر عبارات منظم. قسمت 4.
GO TO FULL VERSION