۲۰ ژانویه ۲۰۲۳

کلاس های کاراکتر (Character classes)

یک تسک عملی را در نظر بگیرید – ما یک شماره تلفن مانند "67-45-123-(903)7+" داریم و باید آن را به ارقام تبدیل کنیم: 79031234567.

برای انجام این تسک، می‌ توانیم هر چیزی را که عدد نیست پیدا و حذف کنیم. کلاس های کاراکتر می تواند در این مورد کمک کند.

کلاس کاراکتر نماد خاصی است که با هر نمادی از یک مجموعه خاص مطابقت دارد.

برای شروع، بیایید کلاس «ارقام» را بررسی کنیم. به صورت \d نوشته می‌ شود و با “هر رقمی” مطابقت دارد.

به عنوان مثال، بیایید اولین رقم را در شماره تلفن پیدا کنیم:

let str = "+7(903)-123-45-67";

let regexp = /\d/;

alert( str.match(regexp) ); // 7

بدون پرچم g، عبارت باقاعده فقط به دنبال اولین تطابق است، که اولین رقم \d می باشد.

بیایید پرچم g را اضافه کنیم تا همه ارقام را پیدا کنیم:

let str = "+7(903)-123-45-67";

let regexp = /\d/g;

alert( str.match(regexp) ); // آرایه ای از اعداد : 7,9,0,3,1,2,3,4,5,6,7

// :بیایید از این آرایه شماره تلفنی بسازیم که تنها حاوی ارقام است
alert( str.match(regexp).join('') ); // 79031234567

این یک کلاس کاراکتر برای ارقام بود. کلاس های کاراکتر های دیگری نیز وجود دارند.

بیشترین استفاده ها عبارتند از:

\d (“d” مخفف “digit(رقم)”)
رقم: کاراکتری از 0 تا 9.
\s (“s” مخفف “space(فاصله)”)
یک علامت فاصله: شامل فاصله‌ها، تب ها t\، خطوط جدید n\ و چند کاراکتر کمیاب دیگر، مانند v\، f\ و r\.
\w (“w” مخفف “word”)
یک کاراکتر “کلمه ای”: یا یک حرف الفبای لاتین یا یک رقم یا زیرخط _. حروف غیر لاتین (مانند سیریلیک یا هندی) به \w تعلق ندارند.

به عنوان مثال، \d\s\w به معنای یک رقم است که به دنبال آن یک کاراکتر فاصله و به دنبال آن یک کاراکتر کلمه‌ای مانند 1 a.

یک regexp ممکن است شامل نمادهای معمولی و کلاس های کاراکتر باشد.

برای مثال، CSS\d با رشته Match:CSS با یک رقم بعد از آن مطابقت دارد:

let str = "Is there CSS4?";
let regexp = /CSS\d/

alert( str.match(regexp) ); // CSS4

همچنین می توانیم از بسیاری از کلاس های کاراکتر استفاده کنیم:

alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'

عبارت دارای مطابقت (هر کلاس کاراکتر regexp دارای کاراکتر نتیجه مربوطه است):

کلاس های معکوس (Inverse classes)

برای هر کلاس کاراکتر یک “کلاس معکوس” وجود دارد که با همان حرف مشخص می شود، اما با حروف بزرگ نشان داده می شود.

“معکوس” به این معنی است که با تمام کاراکتر های دیگر مطابقت دارد، به عنوان مثال:

\D
غیر رقمی: هر کاراکتری به جز \d، به عنوان مثال یک حرف.
\S
بدون فاصله: هر کاراکتری به جز \s، به عنوان مثال یک حرف.
\W
کاراکتر غیر کلمه ای: هر چیزی جز \w، به عنوان مثال یک حرف غیر لاتین یا یک فاصله.

در ابتدای فصل دیدیم که چگونه از رشته ای مانند +7(903)-123-45-67 یک شماره تلفن تنها با اعداد بسازیم: همه ارقام را پیدا کنید و آنها را به هم متصل کنید.

let str = "+7(903)-123-45-67";

alert( str.match(/\d/g).join('') ); // 79031234567

یک راه جایگزین و کوتاهتر این است که \D غیر رقمی را پیدا کنید و آنها را از رشته حذف کنید:

let str = "+7(903)-123-45-67";

alert( str.replace(/\D/g, "") ); // 79031234567

نقطه، “هر کاراکتری” است

نقطه .:pattern یک کلاس کاراکتر ویژه است که با “هر کاراکتری به جز خط جدید” مطابقت دارد.

برای مثال:

alert( "Z".match(/./) ); // Z

یا در وسط یک regexp:

let regexp = /CS.4/;

alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (فاصله نیز کاراکتر می باشد)

لطفاً توجه داشته باشید که نقطه به معنای “هر کاراکتری” است، اما نه “عدم وجود یک کاراکتر”. باید کاراکتری وجود داشته باشد که با آن مطابقت داشته باشد:

alert( "CS4".match(/CS.4/) ); // null, منطبق نیست زیرا هیچ کاراکتری برای نقطه وجود ندارد

نقطه به معنای واقعی کلمه به عنوان هر کاراکتر با پرچم “s” است.

به طور پیش فرض، یک نقطه با کاراکتر خط جدید n\ مطابقت ندارد.

برای مثال، عبارت باقاعده A.B با A و سپس B با هر کاراکتری بین آنها، به جز خط جدید n\ مطابقت دارد:

alert( "A\nB".match(/A.B/) ); // null (مطابقت ندارد)

موقعیت‌ های زیادی وجود دارد که می‌ خواهیم یک نقطه به معنای واقعی کلمه “هر کاراکتری” باشد و شامل خط جدید باشد.

این همان کاری است که flag s انجام می دهد. اگر یک regexp، آن را داشته باشد، یک نقطه .:pattern به معنای واقعی کلمه با هر کاراکتری مطابقت دارد:

alert( "A\nB".match(/A.B/s) ); // A\nB (!مطابقت دارد)
Not supported in IE

پرچم s در IE پشتیبانی نمی شود.

خوشبختانه، جایگزینی وجود دارد که در همه جا کار می کند. می‌ توانیم از یک regexp مانند [\s\S] برای مطابقت با “هر کاراکتری” استفاده کنیم (این الگو در مقاله Sets and ranges [...] پوشش داده خواهد شد).

alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (!مطابقت دارد)

الگوی [\s\S] به معنای واقعی کلمه می گوید: “یا کاراکتر فاصله یا نه”. به عبارت دیگر، “هر چیزی”. می‌ توانیم از یک جفت کلاس مکمل دیگر، مانند [\d\D] استفاده کنیم، که مهم نیست. یا حتی [^]:pattern – به این معنی که با هر کاراکتری به جز هیچ چیز مطابقت دارد.

همچنین اگر بخواهیم هر دو نوع نقطه را در یک الگوی یکسان بخواهیم، می‌ توانیم از این ترفند استفاده کنیم: .:pattern نقطه واقعی که به روش معمولی رفتار می‌کند (خط جدید را شامل نمی شود)، و همچنین راهی برای مطابقت با “هر کاراکتری” با [\s\S] یا مشابه.

به فاصله ها توجه کنید

معمولا ما به فضاها توجه کمی می کنیم. برای ما رشته های 1-5 و 1 - 5 تقریباً یکسان هستند.

اما اگر یک regexp فضاها را در نظر نگیرد، ممکن است کار نکند.

بیایید سعی کنیم ارقامی را که با خط فاصله جدا شده اند پیدا کنیم:

alert( "1 - 5".match(/\d-\d/) ); // null, مطابقت ندارد!

بیایید با افزودن فاصله به regexp به صورت `pattern:\d – \d آن را برطرف کنیم:

alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, حال درست کار می کند
// :استفاده کنیم \s یا می توانیم از کلاس
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, این نیز کار می کند

فضا یک کاراکتر است. از نظر اهمیت با هر کاراکتر دیگری برابر است.

ما نمی‌ توانیم فاصله‌ها را از یک عبارت باقاعده اضافه یا حذف کنیم و انتظار داشته باشیم که به همان صورت عمل کند.

به عبارت دیگر، در یک عبارت باقاعده، همه کاراکترها مهم هستند. فاصله ها نیز همین طور.

خلاصه

کلاس های کاراکتر زیر وجود دارد:

  • \d – رقمی.
  • \D – غیر رقمی.
  • \s – نمادهای فاصله، تب ها، خطوط جدید.
  • \S – هر چیزی به جز \s.
  • \w – حروف لاتین، اعداد، خط زیر '_'.
  • \W – هر چیزی به جز \w.
  • . – اگر با پرچم 's' همراه باشد هر کاراکتری مورد قبول است، در غیر این صورت هر کاراکتری به جز خط جدید n\.

…اما این همه ماجرا نیست!

رمزگذاری یونیکد، که توسط جاوااسکریپت برای رشته ها استفاده می شود، ویژگی های بسیاری را برای کاراکترها فراهم می کند، مانند: حروف به کدام زبان تعلق دارد (اگر حرف باشد)، آیا علامت نقطه گذاری است و غیره.

ما می توانیم بر اساس این ویژگی ها نیز جستجو کنیم. برای این کار بایدu را علامت گذاری کنید که در مقاله بعدی پوشش داده شده است.

نقشه آموزش

نظرات

قبل از نظر دادن این را بخوانید…
  • اگر پیشنهادی برای بهبود ترجمه دارید - لطفا یک ایشوی گیت‌هاب یا یک پول‌ریکوئست به جای کامنت‌گذاشتن باز کنید.
  • اگر چیزی را در مقاله متوجه نمی‌شوید – به دقت توضیح دهید.
  • برای قراردادن یک خط از کد، از تگ <code> استفاده کنید، برای چندین خط – کد را درون تگ <pre> قرار دهید، برای بیش از ده خط کد – از یک جعبهٔ شنی استفاده کنید. (plnkr، jsbin، codepen…)