73- آموزش جاوااسکریپت | قسمت چهارم - کاراکترهای شورتهند و Assertionها در Regex
در این آموزش با کاراکترهای شورتهند Regex مثل `\w`، `\d` و `\s` آشنا میشویم و یاد میگیریم چگونه با `\b` و lookaheadها الگوهای دقیقتری بسازیم.
متن اصلی
در این بخش از آموزش عبارات باقاعده، سراغ شورتهند کاراکتر کلاسها و Assertionها میرویم. این ابزارها نوشتن الگوها را کوتاهتر، خواناتر و دقیقتر میکنند.
برای تست الگوها، از یک تابع کمکی استفاده میکنیم:
function reTest(re, str) {
if (re.test(str)) {
console.log(`${str} matches ${re.source}`);
} else {
console.log(`${str} does not match ${re.source}`);
}
}
کاراکتر شورتهند \w
\w مخفف Word Character است و هر کاراکتر کلمهای را match میکند:
- حروف
- اعداد
- underscore
_
let re = /\w+/;
reTest(re, 'hello'); // matches
reTest(re, 'hello123'); // matches
reTest(re, 'hello_123'); // matches
reTest(re, '!@#'); // does not match
reTest(re, 'hello world'); // matches
در این مثال، + یعنی «یک یا بیشتر»؛ بنابراین Regex تمام بخشهای کلمهای را پیدا میکند.
کاراکتر شورتهند \W
\W نسخه معکوس \w است و هر چیزی بهجز کاراکتر کلمهای را match میکند.
let re = /\W+/;
reTest(re, '!'); // matches
reTest(re, ' '); // matches
reTest(re, '@#$'); // matches
reTest(re, 'hello'); // does not match
reTest(re, '123'); // does not match
کاراکتر شورتهند \d
\d یعنی هر رقم از 0 تا 9.
let re = /\d+/;
reTest(re, '3'); // matches
reTest(re, '12345'); // matches
reTest(re, 'abc123'); // matches
reTest(re, 'abc'); // does not match
کاراکتر شورتهند \D
\D یعنی هر چیزی بهجز رقم.
let re = /\D+/;
reTest(re, 'abc'); // matches
reTest(re, '!@#'); // matches
reTest(re, 'abc123'); // matches
reTest(re, '123'); // does not match
کاراکتر شورتهند \s
\s برای فضای خالی است؛ مثل:
- فاصله
- tab
- line break
let re = /\s+/;
reTest(re, 'hello world'); // matches
reTest(re, 'hello\tworld'); // matches
reTest(re, 'helloworld'); // does not match
کاراکتر شورتهند \S
\S نسخه معکوس \s است و هر چیزی بهجز فضای خالی را match میکند.
let re = /\S+/;
reTest(re, 'hello'); // matches
reTest(re, 'hello world'); // matches
reTest(re, ' '); // does not match
مرز کلمه \b
\b برای مرز کلمه استفاده میشود.
این کاراکتر خودش متن را match نمیکند، بلکه محل شروع یا پایان یک کلمه را بررسی میکند.
let re = /\bhell\b/i;
reTest(re, 'hell'); // matches
reTest(re, 'hello'); // does not match
reTest(re, 'well, hell there'); // matches
در این مثال:
hellبهعنوان یک کلمه مستقل match میشود- اما داخل
hellomatch نمیشود، چون مرز کلمه ندارد
Assertionها و Lookahead
Assertionها برای بررسی شرطها استفاده میشوند، بدون اینکه آن شرط را داخل نتیجه نهایی برگردانند.
یکی از رایجترین Assertionها، lookahead است.
Positive Lookahead: (?=...)
یعنی: این بخش فقط وقتی match شود که بعد از آن، الگوی مشخصشده وجود داشته باشد.
let re = /x(?=y)/;
reTest(re, 'xy'); // matches
reTest(re, 'xz'); // does not match
reTest(re, 'x'); // does not match
در این حالت:
xباید وجود داشته باشد- بعد از آن حتماً
yبیاید
Negative Lookahead: (?!...)
یعنی: این بخش فقط وقتی match شود که بعد از آن، الگوی مشخصشده وجود نداشته باشد.
let re = /x(?!y)/;
reTest(re, 'xy'); // does not match
reTest(re, 'xz'); // matches
reTest(re, 'x'); // matches
جمعبندی
در این بخش یاد گرفتیم:
\wبرای کاراکترهای کلمهای\Wبرای کاراکترهای غیرکلمهای\dبرای اعداد\Dبرای غیرعدد\sبرای فضای خالی\Sبرای غیر فضای خالی\bبرای مرز کلمه(?=...)برای lookahead مثبت(?!...)برای lookahead منفی
در بخش بعدی، از این مفاهیم در یک فرم واقعی استفاده میکنیم تا اعتبارسنجی ورودیها را با Regex انجام دهیم.