<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های MohammadAli Khaksar</title>
        <link>https://virgool.io/feed/@mohammadali0120</link>
        <description>برنامه نویس و طراح وب , عاشق سفر به دنیای درون و کشف حقایق بیشتر...</description>
        <language>fa</language>
        <pubDate>2026-06-07 20:46:59</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>MohammadAli Khaksar</title>
            <link>https://virgool.io/@mohammadali0120</link>
        </image>

                    <item>
                <title>نصب و راه اندازی زبان فارسی در آرچ لینوکس(Arch Linux)</title>
                <link>https://virgool.io/@mohammadali0120/%D9%86%D8%B5%D8%A8-%D9%88-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%A2%D8%B1%DA%86-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3arch-linux-cfh3ebyud4vc</link>
                <description>به نام خدا سلام و عرض ادب امروز میخواستم روش نصب و راه اندازی زبان فارسی رو در آرچ لینوکس بهتون توضیح بدم امیدوارم بکارتون بیاد , خودمو یادم میاد زمانی که آرچ نصب کردم تقریبا یک روز نیم طول کشید تا بتونم زبان فارسی رو اد کنم تمام تنظیمات مربوط به زبان و کیبرد رو دستکاری کردم اما نشد که نشد در واقع فارسی رو تونستم به کیبرد و توزیعم اضافه کنم اما بازهم کاراکتر های فارسی رو نمیشناخت سرانجام متوجه شدم با سوال و پرس جو که باید یک فونت فارسی نصب میکردم :)خب بریم سراغ نصب و راه اندازی زبان فارسی این دستور رو بزنید توی ترمینالsudo nano /etc/locale.genاگه زبان فارسی رو موقع نصب ارچ ان کامنت نکردید  ان کامنتش کنیدخطی که های لایت شده # رو پاک کنیدبعد از ان کامنت کلید های CTRL+O رو بزنید و سپس CTRL+X تا سیو و خارج بشید تو قسمت کیبرد هم فارسی رو اضافه کنید برای مثال واس من گنومه ,  شما هم همینطوری تنظمیش کنید حالا  با استفاده از اون +  بگردید و Persian رو اضافه کنید اگر نبود Other رو بزنید و دنبال Persian بگردید تنظیمات فایل locale.conf رو هم اینطور بزارید sudo nano /etc/locale.confبعد از اینکارایی که کردین بازهم فارسی رو درست نشون نخواهد داد اما نگران نباشید با نصب فونت فارسی درست میشه ما در اینجا vazir رو نصب میکنم البته قبلش یک AUR helper  رو نصب میکنیم که yay-git هست البته قبل از نصب این پکیج  نیازه که  base-devel رو نصب کرده باشید.  sudo pacman -S base-devel  حالاsudo pacman -S git
cd /opt
sudo git clone https://aur.archlinux.org/yay-git.git
cd yay-git
makepkg -siبعد از نصب yay-git  میریم سراغ نصب فونت git clone https://aur.archlinux.org/vazir-fonts.git بزارید دانلود شه بعدش بزنیدcd ~و بعدcd vazir-fonts حالا بزنید makepkg -si و بزارید نصب شه و در اخر دستور زیر رو بزنیدrebootتوجه داشته باشید که دقیقا طبق دستور العمل بالا عمل کنید خیلی خوشحال شدم که تونستم یکبار دیگه تجربیات و دانسته هام در اختیار شما دوستان قرار بدم امیدوارم مفید باشه.سوالی بود زیر همین پست درج کنید.</description>
                <category>MohammadAli Khaksar</category>
                <author>MohammadAli Khaksar</author>
                <pubDate>Thu, 09 Apr 2020 11:12:25 +0430</pubDate>
            </item>
                    <item>
                <title>عبارت های منظم در جاوا اسکریپت , Regular expressions in javascript</title>
                <link>https://virgool.io/web-how/%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86%D8%B8%D9%85-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-regular-expressions-in-javascript-yb330mxufocb</link>
                <description>Regular expressions in javascriptامیدوارم از این سری اموزش های بنده لذت برده باشید و اگر کم و کاستی بود عذرخواهی بنده رو بپذیرید و چنانچه اگر فکر میکنید که بخش هایی از اموزش نیاز به تغییرات داره تو قسمت نظرات اعلام کنید  در این قسمت از اموزش regular expressions که قسمت اخر هست به چند بحث مهم باقی مونده میپردازیم و در نهایت این اموزش رو با یک مثال عملی که در اخر همین بخش هست به پایان میرسونیم فلگ y از فلگ y برای جستجو در موقعیت (جایگاه) پترن استفاده میشه قبل اینکه درباره فلگ y مثال بزنم مثال زیر رو ببینید : let str = &#039;let varName&#039;;

let regexp = /\w+/g;
console.log(regexp.lastIndex); // 0 (ابتدا ی lastIndex=0)

let word1 = regexp.exec&#40;str&#41;;
console.log(word1[0]); // let (1st word)
console.log(regexp.lastIndex); // 3 (اخرین پوزیشن مچ شده )

let word2 = regexp.exec&#40;str&#41;;
console.log(word2[0]); // varName (2nd word)
console.log(regexp.lastIndex); // 11 (اخرین پوزیشن مچ شده )

let word3 = regexp.exec&#40;str&#41;;
console.log(word3); // null (مقدار منطبق دیگه ای وجود نداره)
console.log(regexp.lastIndex); // 0 
//(در اخر جستجو تظنیم مجدد میشه یعنی دوباره ازاولین پوزیشن که  0  هست شروع میشه)برای جستجو کردن مقادیری که توی متغییر str وجود دارن میتونیم از متد exec استفاده کنیم نکته : اگر پترن ما فلگ g یا y رو نداشته باشه به پیدا کردن اولین مقدار منطبق(مچ) بسنده میکنهاگر فلگ g وجود داشته باشه شروع میکنه به جستجو اولین مقدار ذخیره شده در رشته و پوزیشن(موقعیت,محل) اخرین کاراکتر رو ذخیره میکنه توی پراپرتی lastIndex و اگر مقدار دیگه ای باشه که منطبق باشه دوباره میره تا اخرین پوزیشن   و دوباره اون رو میریزه توی lastIndex و به همین ترتیب نکته : وقتی پترن شروع به مچ شدن میکنه پوزیشن  پراپرتی lastIndex برابر با 0 هست بنابراین بعد از هربار فراخوانی متغییر str درون exec که مثالش بالا هست مقادیر منطبق شده پشت سرهم توی کنسول نمایش داده میشن تا برسه به اخرین مقدار منطبق شده و چنانچه مقدار قابل انطباقی وجود نداشته باشه خروجی null خواهد بود.هر مقدار منطبق مانند یک ارایه با گروه و پراپرتی های اضافه خودش هست , ما میتونیم بجای مثال بالا از حلقه استفاده کنیم مثال زیر رو ببینید :let str = &#039;let varName&#039;;
let regexp = /\w+/g;
let result;
while (result = regexp.exec&#40;str&#41;) {
  console.log( `Found ${result[0]} at position ${result.index}` );
  // Found let at position 0, then
  // Found varName at position 4
}در واقع حلقه while در اینجا کار متد matchAll رو میکنه که توضیح دشواری نداره یادگیری این مورد رو به خودتون واگذار میکنم :) میتونید از لینک زیر هم استفاده کنید :https://javascript.info/regexp-methods#str-matchall-regexpما میتونیم پوزیشن متد lastIndex رو به صورت کاستوم (دستی) هم مقدار بدیم مثال زیر رو ببینید : let str = &#039;let varName = &amp;quotvalue&amp;quot&#039;;
let regexp = /\w+/g; //بدون فلگ g 
//متد lastIndex 
//نادیده گرفته میشه
regexp.lastIndex = 4; //پوزیشن دستی که بهش دادیم 
let word = regexp.exec&#40;str&#41;;
console.log(word); // varName
نکته مهم : در واقع یکی از تفاوت های فلگ g با y در این است که فلگ g میتونه از قبل یا بعد از اخرین پوزیشن منطبق شده شروع کنه به ثبت پوزیشن توی پراپرتی lastIndex یعنی اگر شما space (فاصله) رو بهش به عنوان پوزیشن بدید میره قبل یا بعدش رو که کاراکتر رشته ای هست رو میگیره  اما فلگ y فقط خوده کاراکتر رو به عنوان پوزیشن میریزه توی lastIndex به مثال بالا و پایین توجه کنید .let str = &#039;let varName = &amp;quotvalue&amp;quot&#039;;
let regexp = /\w+/y;
regexp.lastIndex = 3;
console.log( regexp.exec&#40;str&#41; ); // null (پوزیشن داده شده در اینجا فاصله است نه کاراکتر)
regexp.lastIndex = 4;
console.log( regexp.exec&#40;str&#41; ); // varName (word at position 4)
همانطور که گفتیم و در مثال بالا دیدید در خط چهارم مثال بالا خروجی null شد چون پوزیشن 3 در متغییر str فاصله (space) بود تصور کنید ما یک متن طولانی داریم و هیچ مقدار قابل انطباقی درونش نیست و شما با فلگ g درونش سرچ میکنید این سرچ تا پایان متن ادامه خواهد داشت این امر زمان قابل ملاحظه ای را بجای  سرچ کردن با y خواهد گرفتدر کارهای مانند تحلیل واژگان(lexical analysis) معمولا بسیاری از جستجو ها در نقطه دقیق پوزیشن انجام میگیرد .استفاده از فلگ y کلید پرفرمونس (کارایی,اجرا) خوب است کاراکتر caret (^)از کاراکتر caret (^)علاوه بر محدود کردن پترن که در قسمت اول اموزشمون گفتیم  میتوان به عنوان محدود کننده کاراکتر ها هم استفاده کرد برای مثال میتونیم کاراکتر هایی مثل  # % رو محدود کنید مثال زیر رو ببینید :let str = &#039;example@#email.com&#039;;
console.log(str.replace(/\w+/g, &#039;&#039;));  //@#.من برای درک بهتر از متد repalce استفاده کردم برای اینکه نیازی به استفاده از متد نداشته باشید برید تو این سایتی که لینکش رو میدم و اونجا امتحان کنید(البته فک میکنم تحریم باشه) مثل تصویر زیر:https://www.regexpal.com/ در تصویر بالا همانطور که مشاهده میکنید کاراکتر @ و . نادیده گرفته شدن نکته : کاراکتر . بیرون از [ ] یک کاراکتر خاص شناخته میشه و درون [ ] یک کاراکتر معمولی هست فلگ m این فلگ برای مقادیر چند خطی مورد استفاده قرار میگیره , به مثال های زیر توجه کنید : توجه داشته باشید که برای تعریف مقادیر چند خطی درون یک متغییر در جاوا اسکریپت باید از بک تیک(&#x60;&#x60;) استفاده کنید (محل قرار گرفتنش کنار عدد یک روی کیبرد هست زیر Esc) let str = `Hello
Hello
Hello
`;
console.log(str.replace(/^Hello$/, &#039;GoodBye&#039;)); //پترن نمیتونه شناخته بشه چون مقدار متغییر 
// چند خطی هست str 

//Hello Hello Hellolet str = `Hello
 Hello
 Hello
 `; 
console.log(str.replace(/^Hello$/m, &#039;GoodBye&#039;));  //پترن رشته رو شناخت 
// GoodBye  Hello Hellolet str = `Hello
Hello
Hello
`;
console.log(str.replace(/^Hello$/mg, &#039;GoodBye&#039;));   /پترن رشته رو شناخت و بدلیل استفاده از 
// فلگ g 
// تمامی مقادیر متغییر
// str تغییر کرد
 //GoodBye GoodBye GoodByeمثال عملی :مثال اعتبار سنجی فرم  :index.htmlstyle.cssapp.jsهمچنین میتونید کد هارو رو بصورت متنی هم ببینید :https://codepen.io/mohammadali0120/pen/VwvZvWQتقریبا تمامی توضیحات مربوط به پترن در زیر هر خط  از کد پترن  به فارسی و انگلیسی نوشته شده .خب امیدوارم از این مجموعه اموزش های Regular Expressions لذت برده باشید و بکارتون اومده بشه سعی کردم در این اموزش اکثر مواردی رو که نیازه پوشش بدم اما اگر دوست دارید عمیق تر این موضوع رو یاد بگیرید میتونید به لینک دوم منابعی که در زیر معرفی کردم مراجعه کنید , پیشنهاد یا انتقادی هم  بود زیر همین پست درج کنید .https://eloquentjavascript.net/09_regexp.htmlhttps://javascript.info/regular-expressionsپایان اموزش</description>
                <category>MohammadAli Khaksar</category>
                <author>MohammadAli Khaksar</author>
                <pubDate>Wed, 08 Apr 2020 02:41:55 +0430</pubDate>
            </item>
                    <item>
                <title>عبارت های منظم در جاوا اسکریپت , Regular expressions in javascript</title>
                <link>https://virgool.io/@mohammadali0120/%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86%D8%B8%D9%85-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-regular-expressions-in-javascript-qquaod17z9sh</link>
                <description>قسمت دومکلاس Date و کار با تاریخ در عبارات منظم قبل از اینکه بریم سراغ کار با کلاس Date بهتره کمی کار کنیم .برای دریافت زمان جاری current time کافیه فقط کلاس Date رو new کنید console.log(new Date()); //Sat Mar 28 2020 01:03:48 GMT+0430 (Iran Daylight Time)برای دادن تاریخ دستی (custom) میتونید مقادیری که دوست دارید رو بدیدconsole.log(new Date(2009, 11, 9)); //Mon Mar 09 2020 00:00:00 GMT+0330 (Iran Standard Time) 
console.log(new Date(2009, 11, 9, 12, 59, 59, 999)); //Wed Dec 09 2015 12:59:59 GMT+0330 (Iran Standard Time)توجه داشته باشید که جاوا اسکریپت ماه رو از 0 شروع میکنه یعنی همانطور که در مثال بالا دیدید ما 11 یعنی ماه نوامبر november رو دادیم اما جاوا اسکریپت ماه 12 ام میلادی یعنی دسامبر december رو به ما نمایش داده این امر یکم گیج کنندست پس مراقب باشید.همچنین همانطور که دیدید 4 ارگومان دیگه یعنی ساعت , دقیقه ,ثانیه و میکرو ثانیه اختیاری هستند همانطور که میدانید تاریخ بیشتر زبان های برنامه نویسی بر اساس قراردادی تعبیه شدن که بهش میگن تایم استمپ Timestamp این قرار داد از یونیکس تایم Unix Time پیروی میکنه که در سال 1970 بوجود اومده و بار اساس میلی ثانیه هست میتونید از شی getTime استفاده کنید تا تاریخ مورد نظرتون رو برا اساس میکرو ثانیه تحویل بده یعنی برعکس مثال های زیر رو ببینید:console.log(new Date(2020, 03, 28).getTime()); //1588015800000
console.log(new Date(1588015800000)); //Tue Apr 28 2020 00:00:00 GMT+0430 (Iran Daylight Time)همچنین میتونید تایم جاری رو به صورت میلی ثانیه از این طریق هم بگیرید :console.log(Date.now());خب دیگه بحث زمان و تاریخ رو ادامه نمیدیم میریم سراغ عبارت های منظم regular expressionsمتد execی متد دیگه علاوه بر متد test داریم (test رو در بخش اول اموزش بهش اشاره کرده بودم) به نام exec  که مخفف execute هست این متد میاد بررسی میکنه که ایا مقداری که بهش میدید با پترن تطابق داره یا نه به عبارت دیگه این مقداری که به عنوان ارگومان بهش پاس میدید جزیی از پترن هست یا نه اگه باشه که اوکیه در غیر اینصورت null برمیگردونه به مثال زیر توجه کنیدlet str = &#039;hello guys my name is mohammadali&#039;;
let pattern = /(hello)/;
console.log(pattern.exec&#40;str&#41;); 
همانطور که مشاهده میکنید ما اومدیم وجود یا عدم وجود hello رو بررسی کردیم اگر کد بالا رو در کنسول مشاهده کنید خواهید دید که hello در پترن وجود داره البته چیزی که کنسول نمایش خواهد داد یک ارایه خواهد بود که شامل مقادیری از جمله مقدار داده شده به عنوان ارگومان به متد exec هست که hello هست و ایندکس بعدی بازهم مقدار داده شده به متد exec هست با این تفاوت که اگر مقادیر چند تا باشند با comma (,) از همه جدا شدن وایندکس بعدی index خواهد بود که مقدارش 0 خواهد بود چون کاراکتر h صفرمین مقدار هست اگر بجای hello در متد exec مقدار guys رو میدادیم index  شش میشد و input هم مقدار داده شده به عنوان ارگومان رو نشون میده با group هم فک نکنم کاری داشته باشیم خروجی کنسول[&amp;quothello&amp;quot, &amp;quothello&amp;quot, index: 0, input: &amp;quothello guys my name is mohammadali&amp;quot, groups: undefined]یک مثال دیگه که امیدوارم با توجه به توضیحات بالا متوجه بشید :let dateTime = &#039;2020-03-28&#039;;
let patt = /^(\d{4})[-./](\d{1,2})[-./](\d{1,2})$/;
console.log(patt.exec&#40;&amp;quot2020/12/02&amp;quot&#41;); 
console.log(patt.exec&#40;dateTime&#41;); همانطور که میدونید این [-./] کاراکتر ها جدا کننده تاریخ هستن مرز کلمه (محدودیت کلمه)Word boundaryیک نوع شورتکات (میانبر)دیگه داریم توی عبارت های منظم که برای محدود کردن کلمات مورد استفاده قرار میگیرهتوضیحی که میشه برای این شورتکات داد اینه : وقتی برنامه شروع به اجرا میکنه ماژول برنامه جستجو رو انجام میده(پیاده سازی میکنه) و وقتی به b\ میرسه متوجه میشه که این شورتکات یک محدود کننده کلمه هست که در ابتدا استرینگ امدهسه حالت مختلف وجود داره که میتوان از word boundary  استفاده کرد :1- در شروع استرینگ , اگر اولین کاراکتر ,کاراکتر استرینگ باشه (کاراکتر خاص نباشه مثل ! # /)2- بین دو کاراکتر باشه که اولیش استرینگ باشه و دومیش استرینگ(کاراکتر خاص) نباشه 3-در پایان استرینگ باشه , اگر اخرین کاراکتر,کاراکتر استرینگ باشه مثال زیر رو ببینید:console.log(&#039;Hello, JavaScript&#039;.match(/\bHello\b/ig)); //Helloدر مثال بالا بعد از b\ یک کاراکتر استرینگ هست (H) اخرین کاراکترش هم که (o) هست رشته هست حالا مثال زیر رو ببینید :console.log(&#039;Hello, JavaScript&#039;.match(/\bHell\b/ig)); //nullجواب null شد چون بعد کاراکتر (l) کاراکتر (o) رو داریم و شرط دوم که در بالاتر ذکر کردیم رعایت نشده زیرا بعد از هر کاراکتر استرینگی باید یک کاراکتر غیر استرینگی باشه خب بعد (l) کاراکتر (o) هست که اونم استرینگ هست پس جواب null خواهد بودیاداوری : فلگ i برای این استفاده میشه که case-sensitive بودن مطرح نباشه یعنی استفاده از کاراکترهای بزرگ و کوچک مجازه فلگ g برای این استفاده میشه که اگر مقادیر دیگه ایم هم بود که با مقدار متد match تطابق داشت اوناروهم دربر بگیره(نشون بده)  اگر از این فلگ استفاده نشه متد match زمانی که به اولین مقدار مطنبق(مچ شده) برسه همون یک مقدار رو برمیگردونه و با بقیه مقادیر منطبق کاری نداره  و ازشون رد میشه .تناوب - Alternation تناوب عبارات کار بسیار ساده ای هست که در عبارات منظم با pipe (|) نشان داده میشود که به نوعی همان کار or در برنامه نویسی رو انجام میده فرض کنید ما ی سری اطلاعات داریم که شامل این موارد میشه : MohmmadReza,doctor,25میخوایم این اطلاعات رو بصورت متناوب (پشت سرهم) نشون بدیم و یا حتی نشون ندیم مثال زیر رو ببینید :let regexp = /html|php|css|java(script)?/gi;
let str = &amp;quotFirst HTML appeared, then CSS, then JavaScript&amp;quot
alert&#40;str.match(regexp&#41;); // &#039;HTML&#039;, &#039;CSS&#039;, &#039;JavaScript&#039;نکته : همیشه بایدحداقل  یکی از مقادیر پترن با مقادیر متغییر str مچ باشه در غیر اینصورت خروجی null  خواهد بودما قبلا با square bracket ها اشنا شدیم که تو مثال رنج(محدوده ای ) از اعداد که توی قسمت اول بود بهتر توضیحش دادیم اگر بخاطر داشته باشید ی هچین مثالی داشتیم [0123456789]که میشد از بینشون هر عددی رو انتخاب کرد .از | هم میشه به این صورت استفاده کرد مثال های زیر رو ببینید : 
let reg = /gr[ea]y/ig;
let str = &#039;grey&#039;;
console.log(str.match(reg)); //[&amp;quotgrey&amp;quot]

let reg2 = /gr(e|a)y/ig;
let str2 = &#039;grey&#039;;
console.log(str2.match(reg2)); //[&amp;quotgrey&amp;quot]هر دو مثال درسته و جواب یکی خواهد بود توجه داشته باشید که حتما مقادیری رو که میخواید بصورت متناوب باشه بین پرانتز قرار بدید مثل مثال دوم این مثال رو ببینید در این مثال از پرانتز  در پترن استفاده نشدهlet reg2 = /gre|ay/ig;
let str2 = &#039;grey&#039;;
console.log(str2.match(reg2));  //[&amp;quotgre&amp;quot]gr(a|e)y = gr[ae]ygra|ey = gra / eyیک مثال پیشرفته تر از مثال های بالا let patt = /^[01]\d|2[0-3]:[0-5]\d$/g;
let str = &#039;12:00&#039;;
console.log(patt.exec&#40;str&#41;);پترن رو کاملا شرح میدم اما نیاز به دقت داره اولین کاراکتر یعنی[01]/dمیاد میگه که اگه ساعت 0 یا 1 داشت اولش رقم بعدیش میتونه هرچی دیگه باشه مثل:00/01/02/03/04/05/06/07/08/09/10/11/12/13/14/15/16/17/18/19منظور از رقم های بالا ساعت به 00am تا 19pm هست رقم هایی که مربوط به 0 هستند از 00 تا 09 و رقم هایی که مربوط به 1 هستند از 10 تا 19 خب حالا اگر ساعت 21 بود چی ؟ اومدیم براش | گذاشتیم و گفتیم اگر ساعت بجای 0 یا 1 اولش 2 بود بیا عدد بعدیش رو از 0 تا 3 مجاز قرار بده مثل :20/21/22/23نکته :24 مجاز نیست چون 00 هست بعد از : مربوط به دقیقه هست که اونم مثل همینه نیاز به دقت داره البته اونم میگم :[0-5]یعنی اولین رقم دقیقه میتونه هر عددی از 0 تا 5 باشه مثل 0/1/2/3/4/5 رقم بعدیم که مربوط به رقم بعدی دقیقه هست مثلا بیست و دو دقیقه اون دو دقیقه میشه رقم دوم و بیست هم رقم اول مثال عددی59...01و در اخر مثلا 00:24 -&gt;دوازده و بیست و چهار دقیقه چنانچه اگر این مثال رو با توضیح من متوجه نشدید میتونید به توضیح اصلی این مثال به لینک  زیر مراجعه کنید من سعی کردم یکم مثال رو بازتر کنم که البته ممکنه گیج کننده شده باشه اما دو س بار بخونید احتمال درکش زیاده :)https://javascript.info/regexp-alternationمتد replace متد replace میتونه در جایگزین کردن بخشی از رشته با بخش دیگه مورد استفاده قرار بگیره مثال زیر رو بینید: console.log(&#039;pap&#039;.replace(&#039;p&#039;, &#039;m&#039;)); //mapهمچنین میشه از replace در عبارات منظم هم استفاده کرد مثال زیر رو ببینید :console.log(&#039;hello padrick&#039;.replace(/[d]/, &#039;t&#039;));  //hello patrickبه این مثال هم توجه کنید :
console.log(&amp;quotBorobudur&amp;quot.replace(/[ou]/g, &amp;quota&amp;quot)); //Barabadarدر مثال بالا ما از فلگ g استفاده کردیم که همانطور که میدونید تمامی مقادیری رو که منطبق(مچ) باشه رو در بر میگیره در کلمه Borobudur ما دو تا o داریم و دوتا هم u که هر چهارتای اینارو تبدیل به a کرده چون ما تو پترن گفتیم [ou]  میتونیم از pipe هم که در بالاتر توضیح دادیم استفاده کنیم مثال زیر رو ببینید :console.log(&amp;quotBorobudur&amp;quot.replace(/o|u/g, &amp;quota&amp;quot)); //Barabadarچند مثال کمی پیچیده تر : console.log(&amp;quotLiskov, Barbara\nMcCarthy, John\nWadler, Philip&amp;quot.replace(/(\w+), (\w+)/g, &amp;quot$2 $1&amp;quot));خب همانطور که میدونید let s = &amp;quotthe cia and fbi&amp;quot
console.log(s.replace(/\b(fbi|cia)\b/g,str =&gt; str.toUpperCase()));
// → the CIA and FBI
در مثال بالا به عنوان ارگومان دوم به متد replace ی ارو فانکشن(arrow function) دادیم که ی مقدار پارامتر بیشتر نداره و همانطور که میدونید وقتی یک ارو فانکشن یک پارامتر داشته باشه میتونه بدون پرانتز و return هم تعریف بشه در واقع منظور اینه :(str)=&gt;return str.tuUpperCase();این str که به عنوان پارامتر به ارو فانکشن داده شده مقادیر پترن (که به عنوان ارگومان اول به replace داده شده هست)  رو شامل میشه ساده تر اینکه fbi و cia ریخته شدن توی strممکنه گیج شده باشید از خوندن این دو تیکه متن اخر اگر شدید دو  س بار بخونیدش متوجه میشید چون توش ارگومان و پارامتر زیاد داشت :)یک مثال کمی پچیده تر از  مثال بالا  بهش بیشتر توجه کنید : let stock = &amp;quot1 lemon, 2 cabbages, and 101 eggs&amp;quot
function minusOne(match, amount, unit) {
      amount = Number(amount) - 1; // Number از تعداد یکی کم کن  دلیل استفاده از 
      // رفع خطاهای احتمالی این مبحث توی بیشتر توی error handling کارایی داره
 if (amount == 1) { // اگر تعداد یکی بود 
      unit = unit.slice(0, unit.length - 1); //از صفرمین مقدار تا یکی مانده به اخری رو شامل شو 
 } else if (amount == 0) { 
     amount = &amp;quotno&amp;quot
}
     return amount + &amp;quot &amp;quot + unit;
}
console.log(stock.replace(/(\d+) (\w+)/g, minusOne))
//no lemon, 1 cabbage, and 100 eggsدر مثال بالا میشه خط سوم رو حذف کرد اون خط صرفا برای این نوشته شده که اگر تعداد تخم مرغ یا کلم یا لیمو بیشتر از یکی بود یکی از تعدادشون کم میکنه بحث متد replace رو همینجا خاتمه میدیم اما شاید بعدا به این بخش ی سری جزئیات اضافه بشه و ادامه ی این مباحث رو در جلسه بعد میگممنابع :https://javascript.info/regular-expressionshttps://eloquentjavascript.net/09_regexp.htmlپایان جلسه دوم</description>
                <category>MohammadAli Khaksar</category>
                <author>MohammadAli Khaksar</author>
                <pubDate>Sun, 05 Apr 2020 21:50:02 +0430</pubDate>
            </item>
                    <item>
                <title>عبارت های منظم در جاوا اسکریپت ,  Regular expressions in javascript</title>
                <link>https://virgool.io/@mohammadali0120/%D8%B9%D8%A8%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86%D8%B8%D9%85-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-regular-expressions-in-javascript-jlmpymyjo0hh</link>
                <description>قسمت اول ساخت یک عبارت منظم و ازمایش منطبق بودن آنهابرای ساخت یا تعریف عبارت منظم (regular expressions) دو راه داریم 1-استفاده از شی RegExp 2-استفاده از فوروارد اسلش(//)مثال:let first=new RegExp(&amp;quotabc&amp;quot);let second=/abc/;هر دوی این مثال ها یک کار رو انجام میدن فقط ی نکته ای هست:وقتی شما از شی RegExp استفاده میکنید اگر از n\ استفاده کنید ی خط فاصله ایجاد خواهد کرد چون مقادیر درون شی RegExp به عنوان یک استرینگ معمولی تعریف میشن چون بین دابل یا سینگل کتیشن قرار میگیرن . اما زمانی که از فوروارد اسلش استفاده میکنید و از شی RegExp استفاده نمیکنید n\ تاثیری نخواهد داشت و مانند یک استرینگ در نظر گرفته میشود مثال های زیر را ببینید: let first = new RegExp(&#039;abc\ndef&#039;);
console.log(first);
output:
/abc
def/
let second = /abc\ndef/;
console.log(second); 
output: /abc\ndef/یکی از متدهایی که در regular expressions وجود داره متد test هست که بررسی میکنه که ایا کاراکتر هایی که بهش میدید جزئی از عبارت منظم هست یا نه مثال زیر رو ببینید console.log(/abc/.test(&amp;quot123abcde&amp;quot));
// → true
console.log(/abc/.test(&amp;quotabxde&amp;quot));
// → falseاولی true شد چون ترتیب بین حروفی که در متد تست قرار گرفته مانند عبارت منظم هست و کاراکتر های قبل و بعدش ربطی به اون 3 کاراکتر   متوالی ندارند.دومی هم false خواهد بود زیرا ترتیب رعایت نشده .نکته: اگر بین مقادیری که در مثال اول درون متد test داده شد space (فاصله) قرار دهیم خروجی false خواهد شد زیرا همانطور که گفتیم ترتیب بین کاراکتر ها باید رعایت شوند.مجموعه ها و کاراکتر هادر عبارات های منظم قرار دادن مجموعه ای از کاراکتر های بین square bracket [ ]  باعث میشه که هر یک از کاراکتر هایی که بین اون مجموعه هستند قابل دسترسی  یعنی طبق مثال اول و دوم از 0 تا 9 هر عددی باشه قابل دسترسیه مثال های  زیر رو ببینیدexample 1:
 let first=/[0-9]/; console.log(first.test(&#039;2020&#039;);//true 
 example 2:
 let second = /[0123456789]/; console.log(second.test(&#039;2020&#039;));//true 
 example 3: 
let second = /[a-z A-Z]/; console.log(second.test(&#039;hello ALI&#039;)); //trueنکته : حتما باید از دش یا خط تیره  (-) استفاده شود زیرا به معنای رنج (محدوده ای ) از اعداد یا کاراکتر ها خواهد بود.  چندین شورتکات(میانبر) وجود دارد که همانطور که میدونید کار مارو اسان تر میکنند:\d هر عددی البته فعلا فقط اعداد لاتین
\w هر کاراکتری که الفبایی باشه و باهاش کلمه درست میشه البته فعلا فقط کاراکترهای انگلیسی
\s فاصله  یا تب یا خط جدید
\D هر کاراکتری که عدد نباشه
\W هر کارکتری که الفبایی نباشه یعنی شامل کارکترهایی که باهاش کلمه ایجاد میشن نباشه
\S فاصله یا تب یا خط جدید نباشه
. (dot) هر کاراکتری بحز خط جدیدمثال:let date = /\d\d-\d\d-\d\d\d\d \d\d:\d\d/;
console.log(date.test(&#039;30-03-2020 13:24&#039;));//true
console.log(date.test(&amp;quot30-jan-2003 15:20&amp;quot));//falseاین مثال واقعا گیج کنندست.برای اطمینان حاصل کردن از اینکه تعداد ارقامی که داده میشه دقیق هست باید بعد از d\ از براکت {} استفاده کنیم   برای مثال اگر بخواهیم مقادیری که به متد testداده میشن 2 یا 4 رقم باشند حداقل مقداری که میتوان به متد تست داد 2 رقم مثلا 23 و بیشترینش 4 تا هست مثلا 2341 let dateTime = /\d{1,2}-\d{1,2}-\d{4} \d{1,2}:\d{2}/;
console.log(dateTime.test(&amp;quot22-03-2003 8:45&amp;quot));//trueاین روش واقعا عالیه فرض کنید بخواید 100 رقم داشته باشید با استفاده از مثال بالا باید 100 تا d\ بنویسید اما با این روشی که  مثالش رو  هم بالاتر گفتیم فقط \d{1,100}را مینویسید.نکته مهم: چنانچه اگر شما به المنت اول که مقدار 22 بهش داده شده یک مقدار عددی دیگه اضافه کنید مثلا بجای 22 بنویسید 2222 یا هر عدد دیگه با هر تعداد رقمی بازهم جواب true خواهد بود همچنین بجای المنت اخر که 45 هست نیز هر عددی با هر رقمی بنویسید بازم جواب true خواهد بود برای حل این مشکل باید از علامت های caret(^) و dollar ($) استفاده کنید علامت ^ در ابتدای پترن قرار میگیره و علامت &amp; در پایان پترن البته داخل // ها باید باشند.مثال :let dateTime = /^\d{1,2}-\d{1,2}-\d{4} \d{1,2}:\d{2}$/;
console.log(dateTime.test(&amp;quot22-30-2003 8:41&amp;quot)); //true
console.log(dateTime.test(&amp;quot444-30-2003 8:41&amp;quot)); //falseتکرار کردن بخشی از الگو(پترن)زمانی که شما از علامت بعلاوه (+) بعد از هر مقدار عبارت منظمی استفاده میکنید به این معنیه که اون المنت ممکنه بیش از یکبار مقدار داده بشه مثال زیر رو ببینید :let oops = /\d+/;
console.log(oops.test(213123));//true
البته بجای استفاده از علامت + میشه از روش دیگه ایم استفاده کرد که پیشنهاد نمیشه .مثال زیر  خط دوم رو ببینید :let str = /^\d+$/; //-&gt; 1 رقم تا هر تعداد رقم
let str1 = /^\d{1,}$/; //-&gt; 1 رقم تا هر تعداد رقم
console.log(str.test(12312));//true
console.log(str1.test(12312));//trueدر واقع در مثال بالا نیازی به استفاده از caret (^) و dollar($) نبود اما پیشنهاد میشه  در مواردی مثل مثال پایین یا مثال هایی که بالاتر زدیم  قرارش بدید چون این علائم پترن رو محدود میکنن و ورودی هایی که به پترن داده میشن نمیتونن بیش از محدوده ای که شما براشون تعیین کردین کم یا زیاد بشن.اگر بخواهید یکی از کاراکترها رو اختیاری کنید یعنی بگید اگر بود فلان اتفاق بیفته اگر نبود هیچ اتفاقی نیفته از علامت سوال (?) استفاده میکنید مثال زیر رو ببینید :let str = /^colou?r$/;
console.log(str.test(&amp;quotcolor&amp;quot));//true
console.log(str.test(&amp;quotcolour&amp;quot));//trueدر پترن بالا ما اومدیم حرف u رو اختیاری کردیم گفتیم اگ u درخط 2  بود که خروجی بده اونم شده true اگرم u نبود که هیچکاری نکن  و همانطور که تو خط 1 میبینید u به متد test داده نشده و روی خروجی هم تاثیری نذاشته.دسته بندی عبارات , Grouping subexpressionsچنانچه اگر بخواهید یک بخش از پترن چندین بار تکرار بشود باید از پرانتز استفاده کنید به مثال زیر توجه کنید 
let cartoonCrying = /boo+(hoo+)+/i;
console.log(cartoonCrying.test(&amp;quotBooooohoooohoooohooo&amp;quot)); //tureدر این پترن ما خواستیم که hoo به تعداد نامشخصی تکرار بشه به همین دلیل اونو بین پرانتز گذاشتیم و بعلاوه بغل o که توی پرانتز هست برای تکرار نامشخص o هست و بعلاوه بعد از پرانتز مربوط به تکرار نامشخص hoo هست flag(پرچم) i هم که بعد forward slash (/) آمده  به معنای اینکه که پترن case-insensitive نباشه یعنی به حروف بزرگ و کوچک حساس نباشه                                     پایان بخش اول </description>
                <category>MohammadAli Khaksar</category>
                <author>MohammadAli Khaksar</author>
                <pubDate>Sat, 28 Mar 2020 00:49:54 +0430</pubDate>
            </item>
            </channel>
</rss>