از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
جاوا اسکریپت: روش شمارش تعداد رخدادهای زیر رشته ای در یک رشته هنگام کار با رشته ها یا مقادیر زیادی متن، احتمالاً با موقعیت هایی روبرو خواهید شد که باید تعداد دفعات وقوع یک زیررشته خاص در رشته دیگر را بشمارید. در این مقاله، روش استفاده از جاوا اسکریپت برای شمارش تعداد رخدادهای زیر رشته را بررسی خواهیم کرد…
سرفصلهای مطلب
معرفی
هنگام کار با رشتهها یا مقادیر زیاد متن، احتمالاً با موقعیتهایی مواجه میشوید که باید شمارش کنید که یک زیررشته خاص در یک رشته دیگر چند بار رخ داده است.
در این مقاله، روش استفاده از جاوا اسکریپت برای شمارش تعداد رخدادهای زیر رشته در یک رشته را بررسی خواهیم کرد. ما رویکردها و روش های مختلف برای به دست آوردن آن عدد را بررسی خواهیم کرد.
اما قبل از شروع، اجازه دهید ابتدا تعریف کنیم که رشته فرعی چیست.
زیر رشته چیست؟
آ رشته فرعی یک دنباله به وضوح تعریف شده از کاراکترهای متوالی در یک رشته است. مثلاً اگر رشته را داشته باشیم “اسم من جان دو است”، سپس “نام است” یک رشته فرعی است، اما “اسم است” به این دلیل نیست که دیگر یک دنباله متوالی نیست (ما ترتیب کلمات را تغییر دادیم). کلمات فردی مانند “است” و “نام” همیشه رشته های فرعی هستند
توجه داشته باشید: “اسم جو است” یک زیررشته معتبر از است “اسم من جان دو است” همچنین. به عبارت دیگر، زیر رشته ها همیشه کلمات کامل نیستند، آنها می توانند بسیار کمتر قابل خواندن باشند.
راه های زیادی برای انجام این کار در جاوا اسکریپت وجود دارد، اما دو روش اصلی عبارتند از split()
روش و عبارات با قاعده.
تعداد رشته های فرعی را در رشته با شمارش کنید شکاف() روش
این split()
یک روش جاوا اسکریپت برای تقسیم رشتهها به آرایهای از زیررشتهها با حفظ رشته اصلی است. این روش الف را می پذیرد جداکننده و یک رشته را بر اساس جدا می کند روی آی تی. اگر جداکننده ای عرضه نشود، split()
آرایه ای را تنها با یک عنصر – رشته اصلی – برمی گرداند.
توجه داشته باشید: احتمالاً بارزترین مثال جداکننده همان است فضای خالی. هنگامی که آن را به عنوان جداکننده برای split()
در روش، رشته اصلی هر زمان که یک فضای خالی ایجاد شود، بریده می شود. بنابراین، split()
متد آرایه ای از کلمات مجزا را از رشته اصلی برمی گرداند.
در این مقاله، از یک ترفند مفید برای بدست آوردن تعداد وقوع یک رشته فرعی در یک رشته استفاده می کنیم. ما رشته فرعی را به عنوان جداکننده در تنظیم می کنیم split()
روش. به این ترتیب، میتوانیم تعداد وقوع زیررشته را از آرایهای استخراج کنیم split()
روش برگشتی:
let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let mySubString = "orange";
let count = myString.split(mySubString).length - 1;
console.log(count); // 3
کد بالا برگشت 3
، اما myString
فقط یک نمونه از رشته دارد “نارنجی”. بیایید با بررسی آرایه ایجاد شده پس از تقسیم رشته اصلی به بررسی کنیم “نارنجی” به عنوان جداکننده:
console.log(myString.split(mySubString));
این به ما می دهد:
('John Doe has 5 ', 's which Jane Doe has only 2 ', 's, Jane gave Mike 1 of her ', ' so she is now left with only 1 Orange.')
اساسا، split()
روش تمام رخدادهای رشته را حذف کرد “نارنجی” از رشته اصلی و برش آن در مکانهایی که رشته فرعی برداشته شده است.
توجه داشته باشید: توجه کنید که چگونه آن را به رشته اعمال می شود “نارنجیs” – “نارنجی” رشته فرعی آن است، بنابراین، split()
حذف می کند “نارنجی” و تنها ما را به حال خود رها می کند “s”.
از زمانی که ما پیدا کرده ایم سه اتفاق از رشته “نارنجی”، رشته اصلی در سه مکان بریده شد – بنابراین ما تولید کردیم چهار رشته فرعی. به همین دلیل باید تفریق کنیم 1
از طول آرایه زمانی که تعداد رخدادهای رشته فرعی را محاسبه می کنیم.
این همه خوب است، اما یکی دیگر وجود دارد نارنجی در رشته اصلی – آخرین کلمه است “نارنجی”. چرا در مثال قبلی آن را شمرده ایم؟ این به این دلیل است که split()
روش است حساس به حروف کوچک و بزرگ، بنابراین در نظر می گیرد “نارنجی” و “نارنجی” به عنوان عناصر مختلف
اگر نیاز به تهیه کد خود دارید مورد غیر حساس، یک راه حل خوب این است که ابتدا کل رشته و زیررشته را به یک مورد متنی خاص قبل از بررسی رخدادها تبدیل کنید:
let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let mySubString = "ORANGE";
let myStringLC = myString.toLowerCase();
let mySubStringLC = mySubString.toLowerCase();
let count = myStringLC.split(mySubStringLC).length - 1;
console.log(); // 4
علاوه بر این، آخرین کاری که میتوانیم انجام دهیم این است که کد خود را با قرار دادن آن در یک تابع قابل استفاده مجدد کنیم:
const countOccurence = (string, word) => {
let stringLC = string.toLowerCase();
let wordLC = word.toLowerCase();
let count = stringLC.split(wordLC).length - 1;
return count
};
تعداد زیر رشته ها را در رشته با RegEx بشمارید
روش دیگر برای شمارش تعداد رخدادها استفاده از آن است عبارات با قاعده (RegEx). آنها الگوهای کاراکترهایی هستند که برای جستجو، تطبیق و اعتبارسنجی رشته ها استفاده می شوند. احتمالاً رایج ترین مورد استفاده از عبارات منظم است اعتبار سنجی فرم – بررسی اینکه آیا رشته یک ایمیل (معتبر)، یک شماره تلفن و غیره است یا خیر. اما در این مقاله از آن برای شمارش تعداد وقوع یک رشته فرعی در یک رشته استفاده می کنیم.
اگر می خواهید در مورد آن بیشتر آشنا شوید عبارات منظم در جاوا اسکریپت، باید راهنمای جامع ما – “راهنمای عبارات منظم و رشته های تطبیق در جاوا اسکریپت” را بخوانید.
اول از همه، باید یک عبارت منظم تعریف کنیم که با زیررشته مورد نظر ما مطابقت داشته باشد. با فرض اینکه می خواهیم تعداد وقوع رشته را پیدا کنیم “نارنجی” در یک رشته بزرگتر، عبارت منظم ما به صورت زیر خواهد بود:
let regex = /orange/gi;
در جاوا اسکریپت، ما یک الگوی عبارت منظم بین دو اسلش رو به جلو می نویسیم – /pattern/
. در صورت تمایل، پس از دومین اسلش رو به جلو، می توانید لیستی از پرچم ها – از کاراکترهای ویژه برای تغییر رفتار پیشفرض هنگام تطبیق الگوها استفاده میشود.
به عنوان مثال، به طور پیش فرض، عبارات منظم فقط با اولین رخداد الگو در یک رشته جستجو مطابقت دارند. همچنین، تطبیق به حروف کوچک و بزرگ حساس است، که شاید آن چیزی نباشد که ما هنگام جستجوی زیر رشته ها می خواهیم. به همین دلیل، ما دو پرچم را که برای هدف این مقاله استفاده خواهیم کرد، معرفی خواهیم کرد:
g
– مطمئن می شود که ما دریافت می کنیم همه وقوع الگو (نه فقط اولی)i
– اطمینان حاصل کنید که تطبیق است مورد غیر حساس
توجه داشته باشید: مستقر روی شما می توانید انتخاب کنید که از چه پرچم هایی استفاده کنید. اینها اجباری نیست.
حال، بیایید از یک عبارت منظم قبلا ایجاد شده برای شمارش تعداد وقوع رشته استفاده کنیم “نارنجی” در myString
:
let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let regex = /orange/gi;
let count = (myString.match(regex) || ()).length;
console.log(count); // 4
توجه داشته باشید: ما اضافه کرده ایم || ()
در صورت عدم تطابق ، یک آرایه خالی را برمی گرداند. بنابراین، تعداد رخدادها بر روی تنظیم خواهد شد 0
.
از طرف دیگر ، ما می توانیم از RegExp()
سازنده برای ایجاد یک عبارت منظم. الگوی جستجو را به عنوان اولین آرگومان می پذیرد و به عنوان آرگومان دوم پرچم گذاری می کند:
let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let regex = new RegExp("orange", "gi");
let count = (myString.match(regex) || ()).length;
console.log(count); // 4
علاوه بر این، میتوانیم با قرار دادن آن در یک تابع جداگانه، آن را قابل استفاده مجدد کنیم:
let countOcurrences = (str, word) => {
var regex = new RegExp(word, "gi");
let count = (str.match(regex) || ()).length;
return count;
};
عبارات دقیق تطبیق دقیق
گاهی اوقات، شما می خواهید برای یک عبارت یا کلمه سختگیرانه مطابقت داشته باشید – به طوری که “پرتقال ها” در شمارش شما یا هیچ کلمه ای که شامل می شود گنجانده نشده است “نارنجی” به خودی خود ، اما کاملاً نیست “نارنجی”. این یک مورد استفاده خاص تر از جستجوی رشته ها در رشته ها است و خوشبختانه نسبتاً آسان است!
let regex = /\Worange\W/gi;
با پایان دادن به مدت ما در داخل \W \W
، ما کاملاً مطابق با آن هستیم “نارنجی” (بدون حساس به حروف بزرگ) و این regex فقط دو بار در جمله ما مطابقت دارد (هر دو “پرتقال ها” مطابقت ندارند).
ارزیابی عملکرد
وقتی هر دو روش را با استفاده از معیار JS، روش تقسیم همیشه سریعتر از روش regex ظاهر می شود، اگرچه این حتی برای مجموعه های متنی نسبتاً بزرگ واقعاً قابل توجه نیست. احتمالاً با استفاده از هم خوب خواهید بود.
توجه داشته باشید: تکیه نکن روی این معیارها به عنوان تصمیم نهایی شماست. درعوض، خودتان آنها را آزمایش کنید تا مشخص کنید کدام یک برای مورد استفاده خاص شما مناسب است.
نتیجه
در این مقاله با دو روش استاندارد برای محاسبه تعداد وقوع زیر رشته ها در یک رشته آشنا شدیم. ما همچنین نتایج را محک زدیم و یادآور شدیم که تا زمانی که برای شما مفید باشد، واقعاً مهم نیست که کدام رویکرد را انتخاب کنید.
منتشر شده در 1403-01-08 20:35:03