۱۶ فوریه ۲۰۲۳

anchorها: شروع ^ رشته و پایان $ آن

کاراکترهای ^ و $ معنای خاصی در یک regexp دارند. به آنها “anchor” (به معنی لنگر) می گویند.

^ در ابتدای متن و $ در پایان متن مطابقت دارد.

به عنوان مثال، بیایید آزمایش کنیم که آیا متن با Mary شروع می شود یا خیر:

let str1 = "Mary had a little lamb";
alert( /^Mary/.test(str1) ); // true

الگوی ^Mary یعنی: “رشته شروع می‌شود و سپس کلمه Mary ظاهر می‌شود”.

مشابه این، می‌توانیم با استفاده از snow$ آزمایش کنیم که آیا رشته به snow ختم می‌شود:

let str1 = "its fleece was white as snow";
alert( /snow$/.test(str1) ); // true

در این موارد خاص، می‌توانیم به جای آن از متدهای مختص به رشته‌ها به نام startsWith/endsWith استفاده کنیم. برای تست های پیچیده تر باید از عبارات منظم استفاده شود.

آزمایش یک انطباق کامل

هر دو anchor یعنی $...^:pattern با هم اغلب برای آزمایش اینکه آیا یک رشته کاملاً با الگو مطابقت دارد یا نه استفاده می شود. به عنوان مثال، برای بررسی اینکه آیا ورودی کاربر در قالب مناسب است یا خیر.

بیایید بررسی کنیم که آیا یک رشته زمان در قالب 12:34 است یا خیر. یعنی: دو رقم، سپس یک دونقطه، و سپس دو رقم دیگر.

در زبان عبارات با قاعده به صورت \d\d:\d\d است:

let goodInput = "12:34";
let badInput = "12:345";

let regexp = /^\d\d:\d\d$/;
alert( regexp.test(goodInput) ); // true
alert( regexp.test(badInput) ); // false

در اینجا تطبیق \d\d:\d\d باید دقیقاً بعد از ابتدای متن ^:pattern شروع شود و انتهای $:pattern باید بلافاصله به دنبال آن بیاید.

کل رشته باید دقیقاً در این قالب باشد. اگر انحراف یا یک کاراکتر اضافی وجود داشته باشد، نتیجه false است.

اگر پرچم m وجود داشته باشد، anchorها رفتار متفاوتی دارند. آن را در مقاله بعدی خواهیم دید.

Anchors have “zero width”

anchorهای ^:pattern و $:pattern تست هستند. عرض آنها صفر است.

به عبارت دیگر، آنها با یک کاراکتر مطابقت ندارند، بلکه موتور regexp را مجبور می‌کنند تا شرایط را بررسی کند (شروع/پایان متن).

تمارین

کدام رشته با الگوی $^:pattern مطابقت دارد؟

یک رشته خالی تنها انطباق است: شروع می شود و بلافاصله تمام می شود.

این کار یک بار دیگر نشان می دهد که anchorها کاراکتر نیستند، بلکه آزمایش هستند.

رشته "" خالی است. موتور ابتدا ^:pattern (شروع ورودی) را تطبیق می‌دهد، بله تطابق دارد، و بلافاصله $:pattern انتهایی را، آن هم مطابقت دارد. بنابراین یک انطباق داریم.

نقشه آموزش