یک تسک عملی را در نظر بگیرید – ما یک شماره تلفن مانند "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 (!مطابقت دارد)
پرچم 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
را علامت گذاری کنید که در مقاله بعدی پوشش داده شده است.