از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
راهنمای عبارات منظم و رشته های تطبیق در جاوا اسکریپت تطبیق رشته ها یا الگوهای رشته می تواند یک مبارزه واقعی باشد. در رایجترین موارد، برای تأیید اعتبار ایمیلها، ورودیهای کاربر، نام فایلها یا بیشتر انواع رشتههای ورودی به این موارد نیاز دارید. در حالی که بسیاری از کتابخانه ها و رویکردهای تطبیق الگو وجود دارد – یک رویکرد آزمایش شده با زمان استفاده از عبارات منظم برای تعریف یک …
سرفصلهای مطلب
معرفی
تطبیق رشته ها یا الگوهای رشته می تواند یک مبارزه واقعی باشد. در رایج ترین موارد، شما به این موارد نیاز خواهید داشت ایمیل ها، ورودی های کاربر، نام فایل ها را تایید کنید، یا بیشتر انواع رشته های ورودی. در حالی که بسیاری از کتابخانه ها و رویکردهای تطبیق الگو وجود دارد – یک رویکرد آزمایش شده با زمان استفاده می شود عبارات با قاعده برای تعریف مجموعه ای از قوانین، یک رشته خاص باید از آن پیروی کند تا با آن الگو مطابقت داشته باشد.
در جاوا اسکریپت، RegExp
کلاس مورد استفاده برای نشان دادن عبارات با قاعده و می توان آن را با چند روش همراه کرد که تطبیق الگوها را آسان تر می کند.
به طور مشخص، پیش نیاز کار با اینها، آگاهی از عبارات منظم است. اگر با نوشتن آنها راحت نیستید، همیشه می توانید از وب سایت های تست RegEx مانند regex101.com یا regexr.com – که به صورت بصری جلوه های عبارات شما را نشان می دهد روی رشته های داده شده
در این راهنما، عبارات منظم در جاوا اسکریپت را بررسی خواهیم کرد
RegExp
کلاس، و همچنینexec()
وtest()
مواد و روش ها.
پس از آن، نگاهی به برخی از روشهای پیادهسازی شده با آن خواهیم انداخت String
هدف – شی – match()
، search()
و replace()
، که با عبارات منظم به عنوان جایگزین کوتاه تری برای استفاده از RegExp
کلاس
عبارات منظم چیست؟
قبل از اینکه به سراغ API جاوا اسکریپت برای کار با RegEx برویم، اجازه دهید ابتدا نگاهی به خود Regular Expression بیاندازیم. اگر قبلاً با آنها آشنا هستید – این می تواند به عنوان یک تجدید کننده عمل کند، یا می توانید بخش را به طور کامل نادیده بگیرید.
آ عبارت منظم (خلاصه RegEx) الگویی از کاراکترها است که برای مطابقت با ترکیب های مختلف رشته ها یا کاراکترها استفاده می شود. قوانین خاصی وجود دارد که باید از آنها پیروی کنید تا بتوانید یک بیان منظم مناسب را تشکیل دهید. ما به سرعت به این موارد می پردازیم و با یک مثال دنبال می کنیم:.
(abc)
– کبریت الف تک شخصیت: a، b یا c(^abc)
– با هر شخصیت مطابقت دارد بجز الف، ب یا ج(a-z)
– منطبق با هر شخصیت در محدوده az\s
– با هر کدام مطابقت دارد فضای سفید شخصیت\w
– با هر کدام مطابقت دارد کلمه شخصیت
اینها برخی از آنها هستند پایه ای الگوها اما آنها می توانند شما را به دورتر برسانند. عبارات منظم همچنین از عملگرها پشتیبانی می کنند:
a?
– اپراتور?
مسابقات صفر یا یک شخصیتa
a*
– اپراتور*
مسابقات صفر یا بیشتر شخصیت هاa
a+
– اپراتور+
مسابقات یکی یا بیشتر شخصیت هاa
a{n}
– اپراتور{n}
منطبق بر شخصیتa
دقیقاn
بارهای متوالیa{n, m}
– اپراتور{n, m}
منطبق بر شخصیتa
بینn
وm
بارهای متوالی\.
– اپراتور\
از شخصیت فرار می کند.
، که به معنای شخصیت است.
معنای معمول خود را نخواهد داشت – مطابق با هر رشته ای – اما به عنوان یک کاراکتر مطابقت داده می شود.
برای عملی کردن این موضوع – بیایید یک عبارت منظم بنویسیم که بررسی می کند آیا یک رشته حاوی است یا خیر @gmail.com
در انتهای رشته قرار دارد و شامل سه کاراکتر است a
قبل از @
سمبل:
"\w+a{3}@gmail\.com"
بیایید این را به سرعت تجزیه کنیم:
\w
– با هر شخصیتی مطابقت داردa{3}
– با سه شخصیت مطابقت داردa
در یک ردیف@gmail\.com
– با یک رشته تحت اللفظی مطابقت دارد “@gmail.com”، در حین فرار از.
با یک\
اپراتور
با این RegEx، می توانیم رشته هایی مانند:
(email protected)
(email protected)
اما نه:
(email protected)
(email protected)
(email protected)
میتوانید ادامه دهید و اینها را در یک تستر RegEx بصری آزمایش کنید تا ببینید کدام قسمتها و چرا مطابقت دارند.
را RegExp کلاس
در جاوا اسکریپت، دو راه برای ایجاد یک عبارت منظم وجود دارد:
- با استفاده از a RegEx به معنای واقعی کلمه، که الگویی است بین
/
شخصیت ها:
let regex = "/(abc)+/";
اگر RegEx شما در سرتاسر اسکریپت ثابت می ماند، باید از این روش استفاده کنید، زیرا این RegEx زمانی که اسکریپت به طور خودکار بارگیری می شود، کامپایل می شود.
- با استفاده از
RegExp()
سازنده:
let regex = new RegExp("(abc)+");
این رویکرد زمانی ترجیح داده می شود که RegEx شما پویا باشد و می تواند در طول چرخه عمر اسکریپت تغییر کند. در جمع آوری شده است زمان اجرا، نه زمان بارگذاری.
توجه داشته باشید: با شروع با ES6، می توانید a را نیز پاس کنید RegEx به معنای واقعی کلمه به عنوان آرگومان سازنده:
let regex = new RegExp(/(abc)+/);
هنگام کار با RegExp
، همچنین میتوانید پرچمها را ارسال کنید – کاراکترهایی با معنی – که روش تطبیق یک الگو را تغییر میدهند. برخی از این پرچم ها عبارتند از:
i
– نشان دهنده مورد غیر حساس، بنابراینA
وa
هنگام تطبیق یکسان هستند
// Matches both ABC and abc one or more times
let regex = new RegExp("(abc)+", "i");
-
g
– به این معنی است که همه موارد ممکن مطابقت خواهند داشت، نه فقط مورد اول -
m
– نشان دهنده حالت چند خطی، که به الگو اجازه می دهد با رشته ای که در چندین خط نوشته شده است مطابقت داده شود
let string = `
This string can also be matched with
Even though it's written in multiple lines
`
را RegExp()
سازنده فقط برای ایجاد یک الگوی مورد آزمایش استفاده می شود. با این حال، این شامل دو روش است که می تواند الگو را آزمایش کند و در صورت مناسب بودن آن را مطابقت دهد: exec()
و test()
.
را exec() روش
را exec()
روش، بدون تعجب زیاد، اجرا می کند جستجو در یک رشته اگر مطابقت وجود داشته باشد، آرایه ای حاوی اطلاعات مربوط به تطابق را برمی گرداند، در غیر این صورت، برمی گردد null
.
برای مدیریت پتانسیل
null
مقادیر، می توانید از اپراتور Null Coalescing اضافه شده به ECMAScript 2020 استفاده کنید.
بیایید آن را آزمایش کنیم روی مثال ایمیل – ما در حال بررسی هستیم که آیا ایمیل به پایان می رسد یا خیر @gmail.com
و شامل سه متوالی است a
شخصیت ها درست قبل از @gmail
دامنه.
همچنین، ما از پرچم بدون حروف کوچک و بزرگ:
let regex = new RegExp(/\w+a{3}@gmail\.com/, "i");
let result1 = regex.exec("(email protected)");
let result2 = regex.exec("(email protected)");
console.log(result1);
console.log(result2);
یا می توانید عملگر Null Coalescing را برای آن اعمال کنید null
-ایمنی:
let regex = new RegExp(/\w+a{3}@gmail\.com/, "i");
let result1 = regex.exec("(email protected)") ?? 'No matched results';
let result2 = regex.exec("(email protected)") ?? 'No matched results';
بیایید نگاهی به خروجی بیندازیم:
( '(email protected)',
index: 0,
input: '(email protected)',
groups: undefined )
( '(email protected)',
index: 0,
input: '(email protected)',
groups: undefined )
این آرایه شامل چندین چیز است:
- رشته همسان
- را مقدار شاخص که رشته های همسان از آن شروع می شود
- رشته ورودی
- را دارایی گروه که یک شی از همه گروههای ضبط نامگذاری شده را در خود نگه میدارد – در بیشتر موارد، این چنین خواهد بود
undefined
اگر می خواهید فقط رشته منطبق را بدون اطلاعات اضافی جدا کنید، می توانید print بیرون
console.log(results(0))
یک ویژگی جالب از exec()
روش این است که شاخص کاراکتر را در جایی که متوقف شده به خاطر می آورد اجرا کردن، بنابراین اساساً می توانید این متد را بارها و بارها فراخوانی کنید تا زمانی که a را دریافت کنید null
در عوض.
به این خاصیت می گویند lastIndex
. به منظور دستیابی به این، شما می توانید یک آرایه ای از رشته ها به exec()
به جای یک رشته
بیایید یک آرایه از سه رشته را ارسال کنیم. که دو تای آنها با هم تطبیق داده می شود و یکی که نمی شود. برای به دست آوردن چندین نتیجه، می توانیم از طریق آرایه حلقه زده و فراخوانی کنیم exec()
تا زمانی که a را دریافت کنیم null
. همچنین، بیایید یک آرایه خالی ایجاد کنیم matchedStrings
و رشته های همسان را به آن فشار دهید.
توجه داشته باشید: شما باید عبور از g
پرچم به RegExp()
سازنده برای به دست آوردن همه نتایج، نه فقط نتایج اول. به این ترتیب، از رفتن به یک حلقه بی نهایت اجتناب می کنید، و هیچ کس حلقه های بی نهایت را دوست ندارد.
let regex = new RegExp(/\w+a{3}@gmail\.com/, "g");
let strings = ("(email protected)", "(email protected)", "(email protected)");
let matchedStrings = ();
let result = regex.exec(strings);
if (result != null) {
matchedStrings.push(result(0));
}
while (result != null) {
result = regex.exec(strings);
if (result != null) {
matchedStrings.push(result(0));
}
}
console.log(matchedStrings);
این نتیجه در:
("(email protected)", "(email protected)")
می بینید که ما هرگز فهرستی از آخرین رشته اجرا شده در یک آرایه را ردیابی نکردیم، اما exec()
می دانست کجا به جستجوی خود ادامه دهد. بسیار تمیز!
را تست() روش
را test()
روش مشابه است exec()
با این تفاوت که آرایه ای حاوی اطلاعات را برمی گرداند، بلکه یک آرایه ساده است true
یا false
. همان جستجو را انجام می دهد exec()
و اگر یک الگو با یک رشته تطبیق داده شود، برمی گردد true
. در غیر این صورت برمی گردد false
:
let regex = new RegExp(/\w+a{3}@gmail\.com/, "i");
let results = regex.test("(email protected)");
console.log(results); // Output: true
results = regex.test("(email protected)");
console.log(results); // Output: false
این روش نمی تواند a را برگرداند null
، و می توانید از نتایج برای دیکته کردن منطق شرطی بیشتر استفاده کنید.
را test()
روش نیز به یاد می آورد lastIndex
از اجرا، بنابراین می توانید آرایه ای از رشته ها را آزمایش کنید. با این حال، اگر یک رشته را دو بار آزمایش کنید، نتایج متفاوتی دریافت خواهید کرد:
let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); // Remember the 'g' flag when working with multiple results
let results = regex.test("(email protected)");
console.log(results); // Output: true
results = regex.test("(email protected)");
console.log(results); // Output: false
دلیلی که می گیریم false
بار دوم به این دلیل است که lastIndex
به انتهای رشته منتقل شده است، بنابراین وقتی برای بار دوم شروع به جستجو می کند – از انتهای رشته شروع می شود – و چیزی برای مطابقت با آن وجود ندارد. بنابراین، باز می گردد false
.
در صورت استفاده باید اطمینان حاصل کنید که تکراری نیست test()
برای رفتار مورد انتظار.
استفاده از test()
با آرایه ای از رشته ها همان است exec()
، با این تفاوت که در حال چاپ خواهید بود true
/false
. در عمل، این معمولاً مورد استفاده قرار نمی گیرد، مگر اینکه تعداد رشته های منطبق را پیگیری کنید.
را همخوانی داشتن() روش
را match()
روش اول است String
روش هایی که ما به آنها نگاه خواهیم کرد – و به خوبی با آنها کار می کند عبارات با قاعده.
طول می کشد a RegEx به عنوان یک آرگومان و an را برمی گرداند آرایه ای از مسابقات یا null
اگر هیچ کدام وجود نداشته باشد، در اصل – تقریباً همان API است exec()
روش الف RegEx
نمونه، مثال:
let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); // Note the 'g' flag
let string = "(email protected)";
let resultArray = string.match(regex);
console.log(resultArray); // Output: ( '(email protected)' )
توجه داشته باشید: می توانید به طور متناوب از a استفاده کنید RegEx به معنای واقعی کلمه در اینجا به جای آن، کد را کوتاه کنید، همانطور که به a کامپایل شده است RegEx
به هر حال نمونه:
let string = "(email protected)";
let resultArray = string.match(/\w+a{3}@gmail\.com/);
console.log(resultArray); // Output: ( '(email protected)' )
برای درک بهتر روش، اجازه دهید RegEx را به تغییر دهید /(a-z)/
– برای مطابقت فقط با کاراکترهای کوچک:
let regex = new RegExp(/(a-z)/, "g"); // Note the 'g' flag
let string = "(email protected)";
let resultArray = string.match(regex);
console.log(resultArray);
این منجر به آرایه ای از تمام کاراکترهای کوچک در رشته می شود:
("s","o","m","e","m","a","i","l","a","a","a","g","m","a","i","l","c","o","m")
را جستجو کردن() روش
را search()
روش جستجوها برای تطابق بین الگوی ارسال شده و رشته. اگر مطابقت پیدا شد، آن است فهرست مطالب برگردانده می شود. در غیر این صورت، روش برمی گردد -1
:
let regex = new RegExp(/\w+a{3}@gmail\.com/, "g"); // Note the 'g' flag
let string = "some string that isn't matched (email protected)";
let result = string.search(regex);
console.log(result); // Output: 31
string = "It should return -1 with this string";
result = string.search(regex);
console.log(result); // Output: -1
این روش باید زمانی مورد استفاده قرار گیرد که می خواهید دریابید که آیا مطابقت پیدا شده است یا خیر و شاخص آن اگر فقط می خواهید بدانید که مطابقت پیدا شده است یا خیر، باید استفاده کنید test()
.
همچنین می توانید این اطلاعات را از قسمت استخراج کنید exec()
روش، اما به شما نیاز دارد که یک عنصر را در یک آرایه مطابقت دهید و این یک نتیجه قابل تجزیه آسانتر را برمیگرداند.
را جایگزین کردن() روش
را replace(to_replace, replace_with)
متد یک رشته جدید را با جایی که الگو مطابقت دارد برمی گرداند to_replace
جایگزین می شود replace_with
.
رشته اصلی را تغییر نمی دهد زیرا رشته ها تغییر ناپذیر هستند.
را to_replace
آرگومان می تواند یک رشته یا یک باشد RegExp
نمونه، مثال. اگر یک رشته باشد، فقط اولین رخداد جایگزین می شود، در حالی که اگر یک باشد RegExp
، تک تک آنها جایگزین خواهند شد.
برای هدف این روش، اجازه دهید جایگزین کردن gmail.com
با yahoo.com
.
let regex = new RegExp(/gmail\.com/, "g"); // Note the 'g' flag
let string = "(email protected)";
let result = string.replace(regex, "yahoo.com");
console.log(result); // Output: (email protected)
string = "(email protected) (email protected)"
result = string.replace(regex, "yahoo.com");
console.log(result); // Output: (email protected) (email protected)
console.log(string); // Output: (email protected) (email protected)
همانطور که در مثال دوم مشاهده می کنید، همه رخدادها مطابقت دارند regex
جایگزین می شوند yahoo.com
. همچنین رشته اصلی بدون تغییر باقی مانده است.
نتیجه
اگرچه خواندن عبارات منظم ممکن است دشوار باشد و در ابتدا درک آن سخت باشد، پس از درک آنها، کار با آنها و ساختن آنها می تواند بسیار سرگرم کننده باشد.
جاوا اسکریپت مطمئن می شود که تست و تطبیق را تا حد امکان آسان می کند، تنها کاری که باید انجام دهید این است که عبارات منظم را یاد بگیرید.
با این حال، با ابزارهایی که امروزه در دسترس هستند و با سایتهایی شبیه به مواردی که در ابتدای راهنما فهرست شدهاند، میتوانید به راحتی تمام قوانین عبارات منظم را یاد بگیرید.
در این راهنما به موارد زیر پرداخته ایم:
- را
RegExp
کلاس – کلاسی که شیء آن برای نمایش یک عبارت منظم استفاده می شود - را
exec()
روش – کدام یک regex را در یک رشته جستجو می کند و آرایه ای از مسابقات (با اطلاعات اضافی) را برمی گرداند. - را
test()
روش – که فقط در صورت وجود مطابقت در یک رشته آزمایش می کند و برمی گرددtrue
/false
. - را
match()
روش – تعریف شده درString
کلاس، آرایه ای از موارد مشابه (بدون اطلاعات اضافی) را برمی گرداند. - را
search()
روش – تعریف شده درString
کلاس، فهرستی از مطابقت یافت شده را برمی گرداند. - را
replace()
روش – تعریف شده درString
کلاس، جایگزین a می شودRegExp()
با یک رشته
احتمالاً بهترین تمرین برای عبارات با قاعده این است که سعی کنید آنهایی را که برای آنها مورد استفاده قرار می گیرند آزمایش کنید تایید ایمیل و رمز عبور
(برچسبها برای ترجمه)# regex
منتشر شده در 1403-01-15 12:47:04