اینترنت پنجره ها اندروید

عبارات با قاعده. عبارات منظم (REGEXP Object) فرم بررسی عبارات منظم جاوا اسکریپت

عبارات با قاعده - این یک زبان است که الگوهای ردیف را بر اساس metasimymbols توصیف می کند. metasimwall یک نماد در بیان منظم است، که برخی از کلاس شخصیت شخصیت کلاس را توصیف می کند، نشان می دهد که موقعیت Substring، نشان می دهد تعداد تکرار و یا شخصیت های گروهی در یک substring. به عنوان مثال، Metacimol \\ D اعداد را توصیف می کند، و $ نشان دهنده پایان رشته است. در بیان منظم، ممکن است شخصیت های متعارف خود را توصیف کنند. مجموعه و مقدار metasimvols در عبارات منظم استاندارد PCRE را توصیف می کند، که بیشتر آنها در JS پشتیبانی می شود.

محدوده بیان منظم

عبارات منظم به عنوان یک قاعده، برای وظایف زیر استفاده می شود:

  • مقایسه. هدف از این کار متوجه خواهد شد که آیا بیان منظم منظم منظم مربوط به متن تعریف شده است.
  • جستجو کردن. با کمک عبارات منظم، مناسب برای پیدا کردن بستر مناسب است و آنها را از متن استخراج می کند.
  • جایگزینی. عبارات منظم اغلب به شما کمک نمی کنند نه تنها پیدا کردن، بلکه در متن یک زیرمجموعه مربوط به بیان منظم جایگزین می شوند.

در نهایت، با عبارات منظم، شما می توانید، به عنوان مثال:

  • بررسی کنید که داده های سفارشی فرم را پر می کنند.
  • در پیوند متن ورودی کاربر به تصویر برای پیوست خودکار بعدی به پیام پیدا کنید.
  • حذف از متن تگ های HTML.
  • قبل از کامپایل کردن خطاهای ساده نحوی، کد را بررسی کنید.

ویژگی های عبارات منظم در JS. ادبیات عبارات منظم

ویژگی اصلی عبارات منظم در JS این است که یک نوع جداگانه برای آنها وجود دارد. درست همانطور که ادبیات رشته ای با نقل قول ها طراحی شده اند، عبارات منظم به صورت منظم توسط slashes (/) طراحی شده اند. بنابراین، کد JS ممکن است حاوی عبارات فرم باشد:

console.log (typeof / tcoder /)؛ // هدف - شی.

در واقع، یک عبارت منظم است که در رشته تعیین می شود

var pattern \u003d regexp جدید ("tcoder")؛

این روش ایجاد معمولا مورد استفاده قرار می گیرد زمانی که لازم است از متغیرها در بیان منظم استفاده شود یا یک عبارت منظم به صورت پویا ایجاد شود. در تمام موارد دیگر، به دلیل نحو کوتاه تر و عدم وجود نیاز به علاوه بر برخی از کاراکترها، ادبیات عبارات منظم به طور منظم استفاده می شود.

نمادها در عبارات منظم

تمام کاراکترهای الفبایی در عبارات منظم، متاسومول نیستند و خود را توصیف می کنند. این به این معنی است که بیان منظم / tcoder / این به یک Tcoder زیرزمینی مطابقت دارد. در عبارات منظم، همچنین ممکن است نشان دهنده شخصیت های الفبایی نیست، مانند: ترجمه رشته (\\ n)، جدول بندی (\\ t) و غیره. همه این کاراکترها نیز به خودشان مطابقت دارند. اسلش معکوس (\\) تحویل داده شده قبل از نماد حروف الفبا آن را یک metachamir اگر چنین است. به عنوان مثال، نماد الفبایی "D" تبدیل به یک متاکامیر به توصیف اعداد اگر آن را با یک لایه (\\ d) پیش بینی می شود.

کلاس های نمادها

کاراکترهای تک در عبارات منظم را می توان به کلاس ها با استفاده از براکت های مربع گروه بندی کرد. کلاس ایجاد شده به این طریق مربوط به هر یک از شخصیت های موجود در آن است. به عنوان مثال، بیان منظم // نامه "T"، "C"، "O"، "D"، "E"، "R" مطابقت دارد.

در کلاس، شما همچنین می توانید طیف وسیعی از کاراکترها را با استفاده از یک خط تنظیم کنید. به عنوان مثال، کلاس به کلاس مربوط می شود. توجه داشته باشید که برخی از metasimwalls در عبارات منظم در حال حاضر کلاس های شخصیت ها را توصیف می کنند. به عنوان مثال، متاکیمول \\ d معادل کلاس است. توجه داشته باشید که Metacharacters توصیف کلاس های شخصیت ها نیز می تواند در کلاس ها گنجانده شود. به عنوان مثال، کلاس [\\ da-F] مربوط به اعداد و حروف "A"، "B"، "D"، "E"، "F"، یعنی هر نماد هگزادسیمال است.

همچنین توانایی توصیف کلاس شخصیتی وجود دارد، مشخص کردن شخصیت هایی که نباید آن را وارد کنید. این کار با استفاده از metasimvol ^ انجام می شود. به عنوان مثال، کلاس [^ \\ d] به هر شخصیتی به جز شماره مربوط می شود.

تکرار

در حال حاضر ما می توانیم توضیح دهیم، می گویند، تعداد دهدهی هر طول داده شده، به سادگی با نوشتن بسیار metasimvolol \\ d، تعداد اعداد در این شماره. موافقم که این رویکرد بسیار راحت نیست. علاوه بر این، ما نمی توانیم طیف وسیعی از تعداد تکرارها را توصیف کنیم. به عنوان مثال، ما نمی توانیم شماره را از یک یا دو رقم توصیف کنیم. خوشبختانه، در عبارات منظم، می توان آن را توصیف محدوده تکرار با استفاده از metasimvols. برای انجام این کار، پس از نماد، کافی است که محدوده تکرار را در براکت های فرفری مشخص کنید. به عنوان مثال، بیان منظم / TCO (1، 3) der / رشته ها "Tcoder"، "Tcooder" و "Tcooder" مطابقت دارند. اگر حداکثر تعداد تکرارها را حذف کنید، کاما و حداقل تعداد تکرار را ترک کنید، می توانید تعداد تکرارها را مشخص کنید. به عنوان مثال، بیان منظم / bo (2،) bs / رشته "boobs"، "boobs"، "boooobs"، "booooobs" مطابقت دارد و به همین ترتیب با هر تعداد حروف "o" حداقل دو.

اگر در براکت های پیچیده حذف و کاما، به سادگی مشخص کردن یک عدد، سپس تعداد دقیق تکرار را نشان می دهد. به عنوان مثال، بیان منظم / \\ d (5) / شماره های پنج رقمی مربوط به

برخی از محدوده های تکراری اغلب مورد استفاده قرار می گیرند و برای تعیین آنها متخلخل آنها وجود دارد.

تکرار حریص

نحو فوق، حداکثر تعداد تکرارها را توصیف می کند، یعنی تمام مقادیر احتمالی تکرار، تعداد آن در محدوده مشخص شده است - حداکثر انتخاب شده است. چنین تکرارها به نام حریص نامیده می شوند. این به این معنی است که عبارت منظم / \\ d + / / در خط آره !! 111 به زیرمجموعه های "111" مربوط می شود و نه "11" یا "1"، هر چند متاسامول "+" همان تکرار را توصیف می کند.

اگر می خواهید یک تکرار نامشخص را اجرا کنید، حداقل تعداد ممکن از تکرار از محدوده مشخص شده وجود دارد، و سپس به سادگی نماد را قرار دهید "؟" پس از طیف تکرار به عنوان مثال، بیان منظم / \\ d +؟ / در ردیف "آره! 111" به "1" Substring، و بیان منظم مطابقت دارد / \\ d (2،) / در همان خط به "11" زیرزمینی مطابقت دارد.

ارزش توجه به یکی از ویژگی های مهم تکرار نامشخص است. بیان منظم را در نظر بگیرید / bo (2،)؟ bs /. در خط "من دوست دارم booooobs" خط، آن را به عنوان یک تکرار حریص، Substring Beooobs، و نه مشاعره، به عنوان ممکن بود فکر می کنم. واقعیت این است که یک بیان منظم با یک مقایسه نمی تواند به چند زیرمجموعه در مکان های مختلف رشته متصل شود. به عبارت دیگر، بیان منظم ما نمی تواند مطابقت با "Boo" و "BS" Substring به یک خط.

جایگزین، گزینه ها

در عبارات منظم، جایگزین ها نیز می توانند مورد استفاده قرار گیرند - برای توصیف مجموعه ای از ردیف هایی که مربوط به یک یا یک قسمت دیگر از یک عبارت منظم هستند. چنین قطعات جایگزین نامیده می شوند و توسط ویژگی عمودی تقسیم می شوند. به عنوان مثال، بیان منظم / دو | دو بار | \\ 2 / این ممکن است به عنوان "دو" جایگزینی، یا "دو برابر" زیرمجموعه یا زیر دست "2" مطابقت داشته باشد. زنجیره جایگزین قبل از اولین تصادف به سمت چپ به سمت چپ پردازش می شود و تنها می تواند به زیر شاخه متصل شود که تنها یک جایگزین توصیف می شود. به عنوان مثال، بیان منظم / جاوا | اسکریپت / خط "من دوست دارم جاوا اسکریپت" تنها با زیر شاخه "جاوا" مطابقت دارد.

گروه بندی

برای در نظر گرفتن چند کاراکتر به عنوان یک عدد صحیح تنها در هنگام استفاده از محدوده تکراری، کلاس های نماد، و هر چیز دیگری، آن را به اندازه کافی فقط به آنها را به پرانتز. به عنوان مثال، بیان منظم / true (coder) / رشته ها "Truecoder" و "TRUE" مطابقت دارند.

پیوندها

علاوه بر این، براکت های دور نمادها را به صورت منظم ترکیب می کنند، شما می توانید به Substring مناسب مراجعه کنید، به سادگی با اشاره به تعداد براکت چپ از جفت براکت های آن. براکت ها از سمت چپ به راست از یک نفر شماره گیری می شوند. به عنوان مثال، به طور منظم / (یک (دو) (چهار) / \\ 1 به یکی، \\ 2 در "دو"، \\ 3 در "سه"، \\ 4 در "چهار" اشاره دارد. به عنوان مثال از استفاده از چنین لینک ها، ما به طور منظم بیان می کنیم / (\\ d) \\ 1 /که شماره های دو رقمی را با همان شماره ها مطابقت می دهد. محدودیت مهمی از استفاده از لینک ها، عدم امکان استفاده از استفاده از آنها در کلاس ها است، به عنوان مثال، یک عدد دو رقمی را با عبارات مختلف به طور منظم توصیف کنید / (\\ d) [^ \\ 1] / غیر ممکن است

unmasking براکت

اغلب لازم است که به سادگی شخصیت ها را گروه بندی کنید، اما نیازی به ایجاد یک لینک وجود ندارد. در این مورد، شما می توانید بلافاصله پس از براکت گروه چپ را بنویسید؟:. به عنوان مثال، به طور منظم / (یک دو سه) / \\ 2 به سه اشاره خواهد کرد.

چنین براکت ها گاهی به نام غیر فوری هستند. آنها یک ویژگی مهم دیگر دارند که ما در درس بعدی صحبت خواهیم کرد.

موقعیت یادداشت

در عبارات منظم، متاسوسی ها نیز وجود دارد که نشان دهنده موقعیتی در خط است. اغلب از همه نمادهای باقی مانده ^، $ نشان دهنده شروع و پایان خط است. به عنوان مثال، بیان منظم /\..+$/ به گسترش اسامی فایل ها و بیان منظم مربوط می شود / ^ \\ d / اولین رقم در رشته، اگر وجود دارد.

چک های پیشرفته مثبت و منفی

با عبارات منظم، شما همچنین می توانید Substring را نیز توصیف کنید، به دنبال آن یا زیر پوشه ای که توسط یک قالب دیگر توصیف شده است. به عنوان مثال، ما نیاز به پیدا کردن کلمه جاوا تنها اگر آن را به دنبال "اسکریپت". این کار را می توان با بیان منظم حل کرد / جاوا (؟ \u003d اسکریپت) /. اگر ما نیاز به توصیف "جاوا" substring پشت که اسکریپت نباید توسط بیان منظم استفاده شود / جاوا (؟! اسکریپت) /.

ما همه چیز را جمع آوری می کنیم که ما در یک صفحه صحبت کردیم.

سمبل مقدار
a | ب هماهنگی یا یا، یا.
(…) براکت گروه بندی همچنین بر روی بستر، الگوی مناسب در براکت ها می تواند اشاره کرد.
(?:…) فقط گروه بندی، بدون فرصت برای ارجاع.
\\ n. اشاره به یک زیرزمینی مربوط به N-M-template.
^ آغاز داده های ورودی یا آغاز رشته.
$ پایان داده های ورودی یا پایان رشته.
a (؟ \u003d b) مطابق با Substring است که الگو را تنها توصیف می کند، تنها در صورتی که زیر پایه توصیف شده توسط الگو b است.
a (؟! ب) مربوط به Substring است که قالب را تنها در صورتی توصیف می کند نه این به دنبال زیر بخش توصیف شده توسط الگو b است.

پرچم

و در نهایت، آخرین عنصر نحو عبارات منظم. پرچم قوانین انطباق را تعیین می کند که متعلق به کل بیان منظم است. در مقایسه با تمام عناصر دیگر، نحو عبارات منظم آنها بلافاصله پس از بیان ادبی نوشته شده یا در خط به عنوان پارامتر دوم سازنده شیء منتقل می شود regexp.

جاوا اسکریپت تنها سه پرچم از عبارات منظم وجود دارد:

من. - هنگام مشخص کردن این پرچم، ثبت نام در نظر گرفته نشده است، به عنوان مثال، بیان منظم \\ جاوا اسکریپت \\ i رشته "جاوا اسکریپت"، "جاوا اسکریپت"، "جاوا اسکریپت"، "جاوا اسکریپت"، و غیره پیکربندی شده و غیره

m. - این پرچم شامل جستجوی چند خطی است. این به این معنی است که اگر در متن نمادهای ترجمه کاراکتر وجود داشته باشد و این پرچم تحویل داده می شود، کاراکترها ^ و $ علاوه بر آغاز و پایان تمام متن نیز به ابتدای و پایان هر ردیف در متن مطابقت دارد. به عنوان مثال، بیان منظم / line $ / m مطابق با "خط" Substring، هر دو در خط "خط اول" و در یک رشته \\ nsecond \\ ntwo رشته.

g. - شامل یک جستجوی جهانی است، یعنی یک عبارت منظم، اگر این پرچم فعال باشد، Substring همزمان با آن خواهد بود، و نه فقط اول، به عنوان اگر این پرچم نیست.

پرچم ها را می توان در یک نظم دلخواه ترکیب کرد، یعنی \\ tcoder \\ miG, \\ tcoder \\ gim, \\ tocder / GMI و غیره، این یکسان است. منظور از پرچم ها مهم نیست که آیا آنها در رشته به عنوان استدلال دوم سازنده شیء منتقل می شوند regexp، من regexp جدید ("tcoder"، "im") و regexp جدید ("tcoder"، "im") همچنین یک چیز.

زای

عبارات منظم یک ابزار بسیار قدرتمند و راحت برای کار با ردیف هستند، که اجازه می دهد تا صدها رشته کد را به یک بیان کاهش دهد. متأسفانه، نحو آنها گاهی اوقات بسیار پیچیده و سخت است و حتی توسعه دهنده با تجربه ترین ممکن است فراموش کند که او به معنای یک بیان منظم به طور منظم پیچیده است، که او چند روز پیش نوشت، اگر او نظر نداد. به همین علت، گاهی اوقات هنوز هم ارزش رها کردن عبارات منظم به نفع روش های معمول برای کار با خطوط است.

عبارات با قاعده ( regexp) - این یک راه بسیار موثر برای کار با ردیف است.

نقشه برداری یک عبارت منظم با استفاده از نحو خاص شما می توانید:

  • متن جستجو در خط
  • جای زیر را جایگزین کنید در خط
  • حذف اطلاعات از رشته

تقریبا تمام زبان های برنامه نویسی عبارات منظم دارند. تفاوت های کوچک در پیاده سازی وجود دارد، اما مفاهیم عمومی تقریبا در همه جا اعمال می شود.

عبارات منظم به دهه 1950 اشاره می شود، زمانی که آنها به عنوان یک قالب جستجوی مفهومی برای الگوریتم های پردازش رشته رسم شدند.

عبارات منظم اجرا شده در یونیکس، مانند GREP، \u200b\u200bSED و ویراستاران متن محبوب، شروع به به دست آوردن محبوبیت و اضافه شدن به زبان برنامه نویسی پرل، و بعد از بسیاری از زبان های دیگر.

جاوا اسکریپت، همراه با پرل، این یکی از زبان های برنامه نویسی است که در آن حمایت از عبارات منظم به طور مستقیم در زبان ساخته شده است.

دشوار، مفید

عبارات منظم جدید ممکن است به نظر می رسد بی معنی مطلق، و اغلب حتی توسعه دهندگان حرفه ای، اگر نه به سرمایه گذاری آن لازم است برای درک آنها ضروری است.

عبارات با قاعده نوشتن سخت است, خواندن دشوار است و حفظ / تغییر دشوار است.

اما گاهی اوقات عبارات منظم هستند تنها راه معقول انجام برخی از دستکاری ها در بالای ردیف ها، به طوری که آنها یک ابزار بسیار ارزشمند هستند.

این راهنما به ساده ترین راه برای به دست آوردن برخی از ایده های عبارات منظم در جاوا اسکریپت و ارائه اطلاعات در مورد چگونگی خواندن و ایجاد عبارات منظم است.

حکومت تجربی این است عبارات منظم ساده برای خواندن و نوشتن ساده هستند.، در حالی که عبارات منظم پیچیده می تواند به سرعت به یک ظرف غذا تبدیل شوداگر شما اصول اولیه را درک نکنید.

عبارات منظم به نظر می رسد

در جاوا اسکریپت، عبارات منظم یک شی است که می تواند به دو روش تعریف شود.

راه اول ایجاد است شی regexp جدید با کمک یک طراح:

Const Re1 \u003d REGEXP جدید ("هی")

راه دوم استفاده است ادبیات عبارات منظم:

Const Re1 \u003d / هی /

شما می دانید آنچه در جاوا اسکریپت وجود دارد اشیاء ادبی و عالم عالم؟ در آن نیز وجود دارد regexp literals.

در مثال فوق، هی نامیده می شود قالب. در شکل لفظی، بین دو اسلش است، و در مورد طراح جسم، نه.

این اولین تفاوت مهم بین دو روش برای تعریف عبارات منظم است، بقیه ما بعدا خواهیم دید.

چطورکار می کنند؟

بیان منظم که ما در بالا تعیین شده به عنوان RE1 بسیار ساده است. این یک رشته هیل بدون محدودیت جستجو می کند: رشته ممکن است شامل بسیاری از متن باشد، و کلمه هی در جایی در بیان وسط و منظم کار خواهد کرد. رشته ممکن است شامل تنها کلمه هی و به طور منظم دوباره کار خواهد کرد.

کاملا ساده است.

شما می توانید سعی کنید عبارات منظم را با استفاده از روش regexp.test (String) آزمایش کنید که مقدار منطقی (بولین) را به دست می آورد:

re1.test ("سلام") // ✅ re1.test ("blablabla hey blablabla") // ✅ re1.test ("او") // ❌ re1.test ("blablabla") // ❌

در مثال بالا، ما به سادگی بررسی می کنیم اگر الگوی "هی" یک عبارت منظم، که در RE1 ذخیره می شود.

این ساده تر از ساده تر است، اما شما قبلا در مورد عبارات منظم بسیار زیاد می دانید.

تثبیت

/ هی /

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

اگر می خواهید خطوطی را پیدا کنید که با هی شروع می شوند، سپس از اپراتور استفاده کنید ^:

/ hehey/.test ("سلام") // ✅ / ^ سلام / .test ("bla hey") // ❌

اگر می خواهید ردیف هایی را که به پایان برسد، پیدا کنید، سپس از اپراتور استفاده کنید $:

/hey $/.test ("سلام") /// ✅ / "bla hey") // ✅ /Hey/.Test ("شما" شما ") // ❌

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

/^HEY /.TEST (* ") // ✅

برای پیدا کردن یک رشته با یک زیر Substring، و شما می توانید از تایید پایان استفاده کنید. *، که با هر نماد تکرار 0 یا بیشتر بار:

/^* joe$/.test ("هی جو") // ✅ / ^ سلام. * Joe $ /. تست ("Heyjoe") // ✅ /^ چطوری جو ") // ✅ /^hey.*Joe$/.test (*" جیهه جیه! ") // ❌

عناصر جستجو بر اساس محدوده

به جای جستجوی یک رشته خاص، می توانید طیف وسیعی از کاراکترها را مشخص کنید، به عنوان مثال:

// // a، b، c، ...، x، y، z // // a، b، c، ...، x، y، z // // a، b، c // / / / 0، 1، 2، 3، ...، 8، 9

این عبارات منظم به دنبال خطوطی هستند که حاوی حداقل یک کاراکتر از محدوده انتخاب شده هستند:

//.test("A ") // ✅ //.test ("1") // ❌ //.test() // ❌ //.test (") // ❌ // .TEST ("DC") // ✅

محدوده ها را می توان ترکیب کرد:

// //.test() // ✅ //.test ("1 ") // ✅ //.test() // ✅

جستجو برای چندین عنصر محدوده

شما می توانید بررسی کنید که رشته تنها یک کاراکتر از محدوده را با استفاده از نماد شامل می شود

/ ^ $ / / / ^ $ /. تست ("a") // ✅ / ^$/.test ("ab") // ❌

Inversion of template

نماد ^ در ابتدای قالب آن را به ابتدای خط متصل می کند.

با استفاده از این نماد داخل محدوده، محدوده را به وجود می آورد، بنابراین:

/ [I-ZA-Z0-9] /. تست ("a") // ❌ / [ада-za-z0-9] /. تست ("1") // ❌ / [^ a-za - z0-9] /. تست ("a") // ❌ / [ада-za-z0-9] /. تست ("@") // ✅

متصدها

  • \\ d همزمان با هر معادل آن است
  • \\ d همزمان با هر نمادی است که عدد معادل آن نیست [^ 0-9]
  • \\ w همزمان با هر علامت عددی الفبایی
  • \\ w همزمان با هر نمادی است که مقدار عددی عددی معادل [^ a-za-z0-9] نیست
  • \\ s با هر آیکون فضایی همخوانی دارد: فضا، برگه، نماد ردیف جدید و فضاهای یونیکد
  • \\ s همگام با هر نمادی است که خالی نیست
  • \\ 0 با null همخوانی دارد
  • \\ n با یک نماد خط جدید همخوانی دارد
  • \\ t با نماد برگه همخوانی دارد
  • \\ uxxxx همزمان با نماد یونیکد با کد XXXX (U پرچم مورد نیاز)
  • . همزمان با هر نماد، به جز یک نماد رشته جدید (مانند \\ n) (اگر از پرچم S استفاده نکنید، بعدا توضیح دهید)
  • [^] همزمان با هر نماد، از جمله یک نماد رشته جدید است. مفید است در هنگام کار با رشته های چند خط

انتخاب در عبارات منظم

اگر می خواهید یکی را انتخاب کنید یا رشته دیگر، استفاده از اپراتور | .

/hey |ho/.test( *) // ✅ /hey |Ho/.test("HO ") // ✅

کوانت کننده

تصور کنید که شما یک عبارت منظم دارید که رشته را فقط از یک رقمی تشکیل می دهد:

شما می توانید استفاده کنید کوانت کننده ؟ که این نماد را اختیاری می کند. در مورد ما، این رقم باید 0 یا 1 بار رخ دهد:

اما اگر ما می خواهیم بیان منظم چند رقمی را داشته باشیم چه؟

شما می توانید آن را در 4 راه با استفاده از +، *، (n) و (n، m) انجام دهید.

+

همزمان با یک یا چند عنصر (\u003e \u003d 1) عناصر:

/ ^ \\ d + $ / / / / d + $ /. تست (12) // ✅ / ^ \\ d + $ /. تست ("14) // ✅ / ^ \\ d + $ /. تست (" 144343 ") // ✅ / ^ \\ d + $ /. تست ("") // ❌ / ^ \\ d + $ /. تست ("1A") // ❌

*

همزمان با 0 یا بیشتر (\u003e \u003d 0) عناصر:

/ ^ \\ d + $ / / ^ \\ / \\ / тест ("12) // ✅ / ^ \\ d.7 / .test (" 14 ") // ✅ / ^ \\ d * $ /. تست (" 144343 ") // ✅ / ^ \\ d * $ /. تست (" ") // ✅ / ^ /d.7/.test ("1") // ❌

(n)

همزمان دقیقا با تعداد عناصر عناصر:

/ ^ \\ d (3) $ / / / /d(3)$/.test("123 ") // ✅ / ^ \\ d (3) $ /. آزمون (" 12 ") // ❌ / ^ \\ D (3) $ /. تست ("1234") // ❌ / ^((3)$/.Test ("ABC") // ✅

(n، m)

همزمان با دامنه از عناصر n به m:

/ ^ \\ d (3.5) $ / / ^ \\ d (3،5) $ /. تست ("123") // ✅ / ^ \\ d (3،5) $ /. test ("21234") // ✅ / ^ \\ d (3،5) $ /.test("12345 ") // ✅ / ^ \\ d (3،5) $ /. تست (123456") // ❌

m می تواند حذف شود و حد دوم را بدون محدودیت ترک کند تا حداقل عناصر N وجود داشته باشد:

/ ^ \\ d (3،) $ / / ^ \\ d (3،) $ /. test ("2) // ❌ / ^ \\ d (3،) $ /. تست (123) // ✅ / ^ \\ d (3.12345 ") // ✅ / ^ \\ d (3،) $ /. تست (123456789") // ✅

عناصر اختیاری

عنصر علامت بعدی؟ ، آن را اختیاری کنید:

/ ^ \\ d (3) \\ w $ / / ^ \\ d (3) \\ w $ //. تست (123) // ✅ / ^ \\ d (3) \\ w؟ $ /. تست (" 123A ") // ✅ / ^ \\ d (3) \\ w؟ $ /. تست (123AB") // ❌

گروه ها

با استفاده از پرانتز، شما می توانید گروه های نماد ایجاد کنید (...).

مثال زیر به دنبال یک هماهنگی دقیق 3 رقم به دنبال یک یا چند کاراکتر الفبایی است:

/ ^ (\\ d (3)) (\\ w +) $ / /) (\\ d (3)) (\\ w +) $ /. تست (123) // ❌ / ^ (\\ d (3)) ( \\ w +) $ // test ("123s") // ✅ / ^ (\\ d (3)) (\\ w +) $ /. تست ("223something") // ✅ / ^ (\\ d (3)) (\\ w +) $ /. تست (1234) // ✅

شخصیت های تکراری که پس از بسته شدن گروه پرانتز به کل گروه یافت می شوند:

/ ^ (\\ d (2)) + $ / ^ (\\ d (2)) + $ /. تست ("12) // ✅ / ^ (\\ d (2)) + $ /. تست (123 ) // ❌ / ^ (\\ d (2)) + $ /. تست ("1234") // ✅

گروه ضبط

تا کنون ما شاهد چگونگی آزمایش خطوط و بررسی اینکه آیا آنها حاوی یک قالب خاص هستند.

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

شما می توانید آن را با کمک گروه ها یا به جای آن انجام دهید گروه ضبط.

به طور پیش فرض، گروه ها دستگیر شده اند. در حال حاضر به جای استفاده از regexp.test (رشته)، که به سادگی یک مقدار منطقی را باز می کند، ما از یکی از روش های زیر استفاده خواهیم کرد:

  • String.match (REGEXP)
  • regexp.exec (رشته)

آنها کاملا مشابه هستند و هر دو یک آرایه را با یک رشته انجام شده به عنوان اولین عنصر باز می گرداند و در سایر عناصر تصادفی برای هر گروه یافت می شود.

اگر هیچ اتفاقی پیدا نشود، آن را باز می گرداند.

"123s" .match (/ ^ (\\ d (3)) (\\ w +) $ /) // array [123S، "123"، "123S"] / ^ (\\ d (3)) w +) $ /. exec (123s) // array ["123s"، "123"، "s"] "سلام" .match (/ hey | ho) /) // array ["هی"، "هی"] /(hey |ho)/.exec ("سلام") // آرایه ["سلام"، "سلام"] / (هی | ho) /. exec ("ha!") // null

هنگامی که گروه چندین بار مطابقت دارد، تنها آخرین مقدار به آرایه بازگشتی اضافه می شود.

"123456789" .match (/ \\ d) + /) // array ["123456789"، "9"]

گروه های اختیاری

گروه های ضبط را می توان با (...) اختیاری کرد؟ . اگر هیچ چیز یافت نشد، عنصر نامشخص به آرایه بازگشتی افزوده می شود:

/ ^ (\\ d (3))) () (\\ w +) $ /. exec ("23 s") // array ["123 S"، "123"، ""، "s"] / ^ ( \\ d (3)) (\\ w +) $ /. exec (123S ") // array [" 123s "،" 123 "، undefined،" s "]

پیوند به گروه یافت شده

هر گروه یافت شده یک عدد اختصاص داده شده است. $ 1 به عنصر اول، 2 دلار به دوم اشاره دارد و غیره. این مفید است زمانی که ما در مورد جایگزینی بخشی از خط صحبت خواهیم کرد.

گروه ضبط نام

این یکی از ویژگی های جدید ES2018 است.

این گروه را می توان یک نام اختصاص داد، و نه فقط یک اسلات در آرایه بازگشت:

Const Re \u003d / (؟ \\ d (4)) - (؟ \\ d (2)) - (؟ \\ d (2)) / constrate \u003d re.exec ("2015-01-02") // نتیجه. groups.year \u003d\u003d\u003d "2015"؛ // نتیجه. groups.month \u003d\u003d\u003d "01"؛ // نتیجه. groups.day \u003d\u003d\u003d "02"؛

با استفاده از مسابقه و اجرا بدون گروه

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

/Hey |Ho/.exec (") // [" سلام "] /(hey).(ho) /. Exec (" Hey Ho ") // [" هی هو "،" سلام "،" ho "]

گروه ها را از بین بردند

از آنجا که گروه های پیش فرض گرفته شده اند، ما نیاز به یک راه برای نادیده گرفتن برخی از گروه ها در آرایه بازگشتی داریم. این امکان پذیر است گروه های سوزانده شدهچه کسی با (؟: ...) شروع می شود؟

"123s" .match (/ ^ (\\ d (3)) (؟: \\ s) (\\ w +) $ /) // null "123 s" .match (/ ^ (\\ d (3)) (؟ : \\ s) (\\ w +) $ /) // array [123 S، "123"، "s"]

پرچم

شما می توانید از پرچم های زیر در هر عبارات منظم استفاده کنید:

  • g: به دنبال هماهنگی در سطح جهانی
  • من: یک بیان منظم به ثبت نام حساس نیست
  • m: شامل حالت چند خطی است. در این حالت، ^ و $ همزمان با شروع و پایان کل ردیف. بدون این پرچم، با رشته های چند خط، آنها با شروع و پایان هر ردیف همخوانی دارند.
  • u: شامل پشتیبانی یونیکد (اضافه شده به ES6 / ES2015)
  • s: (جدید در ES2018) کاهش از "تک خط"، آن را اجازه می دهد. همزمان با نمادهای یک خط جدید

پرچم ها می توانند ترکیب شوند، و همچنین به انتهای خط خطی اضافه می شوند:

/hey/ig.test (") // ✅

یا توسط پارامتر دوم در سازنده Object ReGEXP منتقل می شود:

regexp جدید ("هی"، "ig"). تست ("سلام") // ✅

بازرسی عبارات منظم

شما می توانید خواص عبارات منظم را بررسی کنید:

  • منبع - خط قالب
  • multiline - درست است اگر پرچم M تنظیم شود
  • جهانی - ارزش واقعی پذیرفته شده است اگر پرچم G تنظیم شود
  • ignorecase - ارزش درست است اگر پرچم من تنظیم شده است
  • lastindex
/ ^ (\\ w (3)) $ / i.source // "^ (\\\\ d (3)) (\\\\ w +) $" / ^ (\\ 3)) $ / i.Multiline // false / ^ (\\ w (3)) $ / i.lastindex // 0 / ^ (\\ W (3)) $ / i.IngeNorecase // true / d (\\ w (3)) $ / i.global / / false

محافظ

نمادهای ویژه:

اینها کاراکترهای خاص هستند زیرا هنگام چاپ عبارات منظم، کاراکترهای کنترل می شوند، بنابراین اگر می خواهید از آنها برای جستجوی هماهنگی در داخل قالب استفاده کنید، باید آنها را با استفاده از نماد اسلش معکوس محافظت کنید:

/ ^ \\\\ $ / / ^ \\ ^ $ / / // / ^ \\ ^ تست ("^") ✅ / ^ \\ $$ / // / ^ $ /. تست ("$") ✅

مرزهای رشته

\\ B و \\ B به شما اجازه می دهد تا تعیین کنید که آیا رشته در ابتدای یا پایان کلمه است یا خیر:

  • \\ b هماهنگ می شود اگر مجموعه ای از کاراکترها در ابتدای یا پایان کلمه باشد
  • \\ B هماهنگ می شود اگر مجموعه ای از شخصیت ها در ابتدای یا پایان کلمه نیست

"من یک خرس را دیدم" .match (/ \\ bbear /) // آرایه ["خرس"] "من یک ریش را دیدم" .match (/ / \\ bbear /) // آرایه ["خرس"] "من یک ریش را دیدم" .match (/ \\ bbear \\ b /) // null "cool_bear" .match (/ \\ bbear \\ b /) // null

جایگزینی با عبارات منظم

ما قبلا دیده ایم که چگونه خطوط را برای مطابقت با الگو بررسی کنیم.

ما همچنین شاهد چگونگی استخراج بخشی از ردیف مربوط به قالب به یک آرایه بود.

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

شی رشته در جاوا اسکریپت دارای یک روش جایگزین () است که می تواند بدون عبارات منظم برای استفاده شود یک جایگزین در خط:

"سلام جهان!". جایگزین ("جهان"، "سگ") // سلام سگ! "سگ من یک سگ خوب است!". جایگزین ("سگ"، "گربه") // گربه من یک سگ خوب است!

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

"سلام جهان!" جایگزین (/ جهان /، "سگ") // سلام سگ!

با استفاده از پرچم G IS - این تنها راه جایگزین چندین رخداد در ردیف در وانیل جاوا اسکریپت:

"سگ من یک سگ خوب است!". جایگزین (/ سگ / گرم، "گربه") // گربه من یک گربه خوب است!

گروه ها به ما اجازه می دهند چیزهای عجیب و غریب تر بسازیم، بخش هایی از خطوط را تغییر دهیم:

"سلام، جهان!". جایگزین (/ (\\ w +)، (\\ w +)، /، "$ 2: $ 1 !!!") // "جهان: سلام !!!"

به جای یک رشته، می توانید از تابع استفاده کنید تا چیزهای جالب تر را انجام دهید. این به تعدادی از استدلال ها، مانند رشته های string.match (REGEXP) یا REGEXP.EXEC (رشته) منتقل می شود، جایی که تعداد استدلال ها به تعداد گروه ها بستگی دارد:

"سلام، جهان!". جایگزین (/ (\\ w +)، (\\ w +)، /، (MatchedString، اول، دوم) \u003d\u003e (console.log (اول)؛ console.log (دوم)؛ بازگشت ` $ (second.touppercase ()): $ (اول) !!! `)) //" جهان: سلام !!! "

طمع

عبارات منظم نامیده می شود طمع کار پیش فرض

چه مفهومی داره؟

ما به عنوان مثال یک عبارت منظم است:

/ \\ $ (. +) \\ s؟ /

فرض بر این است که ما باید مقدار را به دلار از خط استخراج کنیم:

/\\$(.+)'s؟/.exec ("این هزینه 100 دلار") // 0

اما اگر بعد از تعداد، کلمات بیشتری داشته باشیم، آن را منحرف می کنیم

/ \\ $ (. +)) \\ s؟ /. exec ("این هزینه 100 دلار و کمتر از 200 دلار است) // 100 و کمتر از 200 دلار است

چرا؟ از آنجا که بیان منظم پس از علامت $ با هر نماد همزمان است. + و تا زمانی که به پایان خط برسد متوقف نمی شود. سپس او متوقف می شود، چرا که؟ فضای نهایی را اختیاری می کند.

برای رفع آن، ما باید مشخص کنیم که بیان منظم باید باشد تنبل و کوچکترین تعداد مختصری را پیدا کنید. آیا می توانیم این را با نماد انجام دهیم؟ پس از Quantifier:

/\\$(.+؟) /s/.exec ("این هزینه 100 دلار و کمتر از 200 دلار است) // 100

بنابراین، نماد؟ ممکن است به معنی چیزهای مختلف بسته به موقعیت آن باشد، بنابراین می تواند یک مقدار و شاخص باشد تنبل حالت

پیش رو: تطبیق رشته بسته به آنچه که به دنبال آن است

با استفاده از؟ \u003d برای جستجو برای مختصات در یک رشته که برای آن یک زیر تعریف شده تعریف شده است

/ راجر (؟ \u003d واترز) / / راجر (؟ \u003d واترز) /. تست ("راجر من سگ من") // False / Roger (؟ \u003d Waters) /. تست ("راجر سگ من و راجر آب من است موسیقیدان مشهور ") // درست است

عملیات معکوس را انجام می دهد و در رشته ای که برای آن اتفاق می افتد پیدا می کند نه بستر قطعی به شرح زیر است:

/ راجر (؟! Waters) / / Roger (؟! Waters) /. تست ("راجر من سگ") // True / Roger (؟! Waters) /. تست ("راجر سگ من و راجر آب من است موسیقیدان مشهور ") // نادرست

گذشته نگر: تطبیق رشته بسته به آنچه پیش از آن است

این یکی از ویژگی های جدید ES2018 است.

پیش از یک نماد استفاده می کند؟ \u003d. گذشته نگر استفاده می کند؟<= :

/(?<=Roger) Waters/ /(?<=Roger) Waters/.test("Pink Waters is my dog") //false /(?<=Roger) Waters/.test("Roger is my dog and Roger Waters is a famous musician") //true

Inversion of Retrespectives استفاده می شود؟

/(?

عبارات منظم و یونیکد

پرچم U در هنگام کار با رشته های یونیکد اجباری است، به ویژه هنگامی که ممکن است برای پردازش خطوط در هواپیماهای Astral که در 1600 عدد یونیکد اول گنجانده نشده است، لازم باشد.

به عنوان مثال، امودی، اما تنها آنها.

/^ $/.test() // ✅ / ^. $ /. تست ("؟") // ❌ / ^. $ / u.test ("؟") // ✅

بنابراین، همیشه از پرچم U استفاده کنید.

یونیکد، و همچنین شخصیت های معمولی، می تواند دامنه ها را پردازش کند:

//.test("A ") // ✅ //.test ("1") // ✅ / [؟ -؟] / u.test ("؟") // ✅ / [؟ -؟] / u .Test ("؟") // ❌

جاوا اسکریپت کدهای ارائه داخلی را بررسی می کند، بنابراین؟< ? < ? на самом деле \u1F436 < \u1F43A < \u1F98A . Посмотрите полный список эмодзи чтобы увидеть коды и узнать их порядок.

خواص غربالگری یونیکد.

همانطور که در بالا گفتیم، در قالب بیان منظم، می توانید از \\ d برای پیدا کردن یک تصادف بر روی هر رقمی استفاده کنید، \\ s برای پیدا کردن یک مسابقه در هر شخصیت علاوه بر یک فضای، \\ w برای پیدا کردن یک تصادف در هر نماد الفبایی و غیره

خواص یونیکد محافظ امکان ES2018 است که عملکرد بسیار خوبی را اضافه می کند، این مفهوم را در تمام کاراکترهای یونیکد گسترش می دهد و اضافه کردن \\ p () و \\ p ().

هر نماد یونیکد دارای مجموعه ای از خواص است. به عنوان مثال، اسکریپت خانواده های زبان را تعریف می کند، ASCII یک مقدار منطقی برابر با واقعی کاراکترهای ASCII و غیره است. شما می توانید این ویژگی را در براکت های فرفری قرار دهید و بیان منظم تأیید می کند که ارزش آن درست است:

/ ^ / uascii) + $ /u.test("abc ") // ✅ / ^ \\ p (ascii) + $ / u.test (" [ایمیل محافظت شده]") // ✅ / ^ \\ P (SCII) + $ /u.test (" ABC؟ ") // ❌

ASCII_HEX_DIGIT یکی دیگر از اموال منطقی است که بررسی می کند که آیا رشته تنها شماره های معتبر بالا قلیایی را شامل می شود:

/ ^ / p (scii_hex_digit) + $ / u.test ("0123456789abcdef") // ✅ / ^ \\ p_ascii_hex_digit) + $ / u.test ("h")

بسیاری از خواص منطق دیگر وجود دارد که می توانید با اضافه کردن نام خود به براکت های فرفری، از جمله حروف بزرگ، حروف کوچک، سفید، حروف الفبا، حروف الفبا، emoji و دیگران را بررسی کنید:

/ ^ /u.test() // ✅ / ^ \\ p (حروف بزرگ) $ /u.test("h ") // ✅ / ^ \\ p (emoji) + $ / u.test (h ") // ❌ / ^ \\ p (emoji) + $ / u.test (" ؟؟ ") // ✅

علاوه بر این خواص باینری، شما می توانید هر ویژگی نماد یونیکد را بررسی کنید تا به یک مقدار خاص مربوط شود. در مثال زیر، من بررسی می کنم که آیا رشته در الفبای یونانی یا لاتین ثبت شده است:

/ ^ cro_script \u003d greek) + $ / u.test ("ελληνικά") // ✅ / ^ \\ p (script \u003d لاتین) + $ / u.test ("سلام") // ✅

مثال ها

استخراج یک عدد از یک رشته

فرض کنید یک رشته حاوی تنها یک عدد وجود دارد که باید حذف شود. / \\ d + / باید آن را انجام دهید:

"تست 123123329" .match (/ \\ d + / /) // array ["123123329"]

جستجو ایمیل آدرس:

ساده ترین رویکرد این است که کاراکترهای باور نکردنی قبل و بعد از علامت @ را بررسی کنید، با کمک \\ s:

/ (\\ s +) @ (\\ s +) \\ ((\\ s +) / / (\\ s +) @ (\\ s +) \\. (\\ s +) /. exec (" [ایمیل محافظت شده]") //["[ایمیل محافظت شده]"،" COPESC "،" جیمیل "،" com "]

با این حال، این یک مثال ساده است، زیرا بسیاری از آدرس های پست الکترونیکی معتبر زیر آن وجود ندارد.

ضبط متن بین نقل قول های دوگانه

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

بهترین راه برای انجام این کار، استفاده است گروه ضبط، از آنجا که ما می دانیم که تصادف ما باید با نماد شروع و پایان یابد "، بنابراین ما می توانیم به راحتی قالب را پیکربندی کنیم، اما ما همچنین می خواهیم این نقل قول ها را از نتیجه حذف کنیم.

ما آنچه را که در نتیجه نیاز داریم پیدا خواهیم کرد:

Const Hello \u003d "سلام" گل زیبا "" Const Crate \u003d / "([_" * "/.eexcogohello) // آرایه [" \\ "گل زیبا \\" "،" گل زیبا "]

گرفتن محتوا از تگ HTML

به عنوان مثال، محتویات را از تگ Span دریافت کنید، به هر تعداد استدلال برای برچسب اجازه می دهد:

/]*>(.*?)<\/span>/ /]*>(.*?)<\/span>/.exec ("test") // null / ]*>(.*?)<\/span>/.exec ("test") // ["test"، "test"] / ]*>(.*?)<\/span>/.exec (" تست") // ["تست"،" تست "]

کلاس regexp در جاوا اسکریپت یک عبارت منظم است - یک شی که الگو شخصیت را توصیف می کند. اشیاء regexp معمولا با استفاده از نحو خاص از ادبیات زیر ایجاد می شوند، اما همچنین می توانند توسط سازنده Regexp () ایجاد شوند.

نحو

// با استفاده از نحو خاص ادبیات var regex \u003d / الگوی / پرچم؛ // با طراح var regex \u003d regexp جدید (الگوی "الگوی"، "پرچم ها")؛ var regex \u003d جدید regexp (/ الگوی /، "پرچم ها")؛

مقادیر پارامتر:

پرچم عبارات منظم

پرچمشرح
g. به شما اجازه می دهد تا همه ی هماهنگی را پیدا کنید و پس از اولین تصادف ( پرچم بازی جهانی).
من.به شما اجازه می دهد بدون ثبت نام مقایسه کنید ( نادیده گرفتن پرونده).
m.نقشه برداری در چندین خط ساخته شده است. پردازش کاراکترهای اولیه و نهایی (^ و $) با توجه به چندین خط ساخته شده است، یعنی نقشه برداری با شروع یا پایان هر ردیف (\\ n یا \\ r تقسیم کننده ها)، و نه تنها با آغاز، یا نه تنها پایان کل خط ( پرچم چند راه).
توالگو به عنوان توالی از نقاط کد یونیکد در نظر گرفته می شود ( پرچم یونیکد).
y.نقشه برداری در شاخص رخ می دهد که نشان دهنده ویژگی Lastindex از این عبارت منظم است، در حالی که نقشه برداری بعدا یا شاخص اولیه ( پرچم چسبنده).

مجموعه های نماد

متصدها

سمبلشرح
. به شما امکان می دهد یک شخصیت را پیدا کنید، به جز نماد یک رشته جدید، یا پایان رشته (\\ n، \\ r، \\ u2028 یا \\ u2029).
\\ D.به شما امکان می دهد یک نماد اعداد را در الفبای پایه لاتین پیدا کنید. معادل استفاده از مجموعه کاراکتر.
\\ D.به شما امکان می دهد هر شخصیتی را پیدا کنید که رقم در الفبای پایه لاتین نیست. معادل مجموعه ای از شخصیت ها [^ 0-9].
\\ S.به شما امکان می دهد یک نماد خالی را پیدا کنید. تحت نماد فضا آن را به عنوان یک فضا، جدول بندی، ترجمه صفحه، ترجمه رشته و دیگر نمادهای کروی از Unicod درک می شود. معادل مجموعه ای از کاراکترها [\\ f \\ n \\ r \\ t \\ v u180e \\ u2000 \\ u2001 \\ u2002 \\ u2003 \\ u2004 \\ u2005 \\ u2006 \\ u2007 \\ u2008 \\ u2009 \\ u2008 \\ u2009 \\ u2008 \\ U2028 \\ u2029 \\ u202f / u205f \\ u3000].
\\ S.به شما امکان می دهد یک نماد تک پیدا کنید که خالی نیست. تحت نماد فضا آن را به عنوان یک فضا، جدول بندی، ترجمه صفحه، ترجمه رشته و دیگر نمادهای کروی از Unicod درک می شود. معادل یک مجموعه از کاراکترها [^ \\ f \\ n \\ n \\ t \\ v \\ u00a0 \\ u1680 \\ u180e \\ u2000 \\ u2001 \\ u2002 \\ u2003 \\ u2004 \\ u2005 \\ u2006 \\ u2007 \\ u2008 \\ u2009 \\ u2008 \\ u2009 \\ u2008 \\ u2028 \\ u2029 \\ u202f / u205f \\ u3000].
[\\ b]به شما امکان می دهد نماد Backspace را پیدا کنید (نماد ویژه \\ B، U + 0008).
\0 به شما امکان می دهد یک نماد 0 (صفر) پیدا کنید.
\\ n.به شما اجازه می دهد یک نماد رشته جدید پیدا کنید.
\\ f.به شما امکان می دهد یک نماد ترجمه صفحه را پیدا کنید.
\\ ربه شما اجازه می دهد یک نماد بازگشت حمل و نقل را پیدا کنید.
\\ t.به شما امکان می دهد یک نماد زبانه افقی پیدا کنید.
\\ v.به شما امکان می دهد یک نماد زبانه عمودی پیدا کنید.
\\ W.به شما اجازه می دهد تا هر علامت الفبایی الفبای پایه پایه لاتین را پیدا کنید، از جمله زیر خط. معادل مجموعه ای از شخصیت ها.
\\ W.به شما امکان می دهد هر شخصیتی را پیدا کنید که نماد از الفبای پایه لاتین نیست. معادل مجموعه ای از شخصیت ها [^ a-za-z0-9_].
\\ cxبه شما امکان می دهد یک نماد کنترل را در رشته پیدا کنید. جایی که X نامه از A به Z است. به عنوان مثال، / \\ cm / نماد CTRL-M را نشان می دهد.
\\hhhhبه شما امکان می دهد یک نماد را با استفاده از مقدار هگزادسیمال پیدا کنید (HH یک مقدار هگزادسیمال دو رقمی است).
uhhhhhبه شما امکان می دهد یک نماد با استفاده از کدگذاری UTF-16 (HHHH - چهار رقمی هگزادسیمال) پیدا کنید.
\\ u (hhhhhh) یا
\\ u (hhhhhhhhh)
به شما امکان می دهد یک نماد را با مقدار Unicode U + Hhhh یا U + Hhhhh (Hexadecimal) پیدا کنید. فقط زمانی که پرچم U مشخص شده است.
\ نشان می دهد که شخصیت بعدی خاص است و نباید به معنای واقعی کلمه تفسیر شود. برای نمادها، که معمولا به روش خاصی تفسیر می شوند، نشان می دهد که شخصیت بعدی خاص نیست و باید به معنای واقعی کلمه تفسیر شود.

محدودیت های

کوانت کننده

سمبلشرح
n *جنبش با هر رشته ای حاوی صفر یا بیشتر رخدادهای نماد رخ می دهد n..
n +کاشت با هر رشته حاوی حداقل یک شخصیت رخ می دهد n..
جنبش با هر رشته ای با یک عنصر قبلی رخ می دهد n. صفر یا یک بار
n (x)مربوط به هر سطر حاوی دنباله ای از شخصیت ها است n. تعداد مشخصی از زمان ها ایکس.. ایکس.
n (x،) ایکس. تجمعات عنصر قبلی n.. ایکس. باید تعداد کل مثبت باشد.
n (x، y)مربوط به هر سطر حاوی حداقل است ایکس.اما نه بیشتر از y. نوشته های عنصر قبلی n.. ایکس. و y. تعداد مثبت عدد صحیح باید وجود داشته باشد.
n *؟
n +؟
n ؟؟؟
n (x)؟
n (x،)؟
n (x، y)؟
جنبش با قیاس با Quantifiers *، +،؟ و (...) با این حال، در حالی که جستجو می شود حداقل مقایسه ممکن است. به طور پیش فرض حالت "حریص" است؟ در انتهای Quantifier اجازه می دهد تا حالت "UNJONE" را مشخص کنید که تکرار مقایسه آن حداقل تعداد ممکن را رخ می دهد.
x (؟ \u003d y)به شما اجازه می دهد تا مقایسه کنید ایکس.فقط اگر برای ایکس. دنبال کردن y..
x (؟! y)به شما اجازه می دهد تا مقایسه کنید ایکس.فقط اگر برای ایکس. انجامش نده y..
x | yمقایسه با هر یک از گزینه های نشان داده شده رخ می دهد.

گروه بندی و لینک ها

سمبلشرح
(ایکس)به شما امکان می دهد یک نماد پیدا کنید ایکس. و به یاد داشته باشید نتیجه مقایسه ("براکت های هیجان انگیز"). یک زیرمجموعه مقایسه می تواند از عناصر آرایه حاصل شود ...، [n]، یا از خواص Object Regexp از پیش تعریف شده از $ 1 ...، 9 دلار.
(؟: ایکس)به شما امکان می دهد یک نماد پیدا کنید ایکس.اما نه به حفظ نتیجه مقایسه ("براکت غیر از دست رفته"). یک زیرمجموعه کامپایل شده از عناصر آرایه حاصل می شود ...، [n]، یا از خواص Object Regexp از پیش تعریف شده $ 1 ...، 9 دلار.
\\ n.پیوند مخالف به آخرین جایگزین، که با N-O مطابقت دارد، در حساب در پرانتز به طور منظم (شماره گیری از براکت ها به سمت راست می رود). n. باید تعداد کل مثبت باشد.

عبارات با قاعده اجازه دهید جستجو انعطاف پذیر برای کلمات و عبارات در متون برای حذف آنها، استخراج یا جایگزینی آنها.

نحو:

// اولین گزینه برای ایجاد یک عبارت منظم var regexp \u003d جدید regexp ( قالب,اصلاح کننده) // نسخه دوم از ایجاد یک عبارت منظم var regexp \u003d / قالب/اصلاح کننده;

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

اصلاح کننده به شما اجازه می دهد که رفتار جستجو را پیکربندی کنید:

  • من. - جستجو بدون ثبت نام حروف؛
  • g. - جستجوی جهانی (همه موارد همزمان در سند یافت می شود، و نه فقط اول)؛
  • m. - جستجوی چند خطی

جستجو برای کلمات و عبارات

ساده ترین استفاده از عبارات منظم، یافتن کلمات و عبارات در متون مختلف است.

بگذارید نمونه ای از استفاده از جستجو با استفاده از اصلاح کننده ها را ارائه دهیم:

// تنظیم بیان منظم RV1 RV1 \u003d / روسیه /؛ // تنظیم عبارات منظم RV2 RV2 \u003d / روسیه / G؛ // تنظیم عبارات منظم RV3 RV3 \u003d / روسیه / IG؛ // فونت جسورانه اختصاص داده شده است، جایی که در هنگام استفاده از // عبارات RV1 در متن یافت می شود: روسیه بزرگترین کشور جهان است. مرز روسیه با 18 کشور. روسیه همچنان ادامه دولت اتحاد جماهیر شوروی است. // فونت جسورانه اختصاص داده می شود، جایی که در هنگام استفاده // عبارات RV2 در متن یافت می شود: روسیه بزرگترین کشور جهان است. مرز روسیه با 18 کشور. روسیه همچنان ادامه کار اتحاد جمشعی از اتحاد جماهیر شوروی است. "؛ // فونت چربی اختصاص داده شده است، جایی که در هنگام استفاده از // عبارات RV3 در متن یافت می شود، روسیه بزرگترین کشور جهان است. روسیه مرز با 18 کشور است. روسیه دولت - جانشین اتحاد جماهیر شوروی است. "

نمادهای ویژه

علاوه بر شخصیت های معمولی در قالب های منظم بیان می تواند مورد استفاده قرار گیرد نمادهای ویژه (فلزات). کاراکترهای ویژه با توصیف در جدول زیر نشان داده شده است:

نماد ویژه شرح
. همزمان با هر نماد، به جز نماد رشته رشته.
\\ W. همزمان با هر نماد حروف الفبا.
\\ W. همزمان با هر نماد الفبایی نیست.
\\ D. با شخصیت های اعداد همخوانی دارد.
\\ D. همزمان با شخصیت هایی که اعداد نیستند.
\\ S. همزمان با نمادهای تیغه است.
\\ S. همزمان با نمادهای فضایی نیست.
\\ B. همسایه ها تنها در مرزهای کلمات (در آغاز یا پایان) جستجو خواهند شد.
\\ B. همزمان ها تنها در مرزهای کلمات تحریف خواهند شد.
\\ n. همزمان با نماد ترجمه ردیف.

/ * بیان reg1 تمامی کلمات را با دو حرف دلخواه شروع می کند و با "Vet" پایان می یابد. از آنجایی که کلمات در این پیشنهاد توسط یک فضای تقسیم می شوند، سپس در ابتدا و در پایان ما Specialsimol را اضافه خواهیم کرد) * / reg1 \u003d / \\ s..t. \\ s / g؛ txt \u003d "hello cownant closet velvetet"؛ document.write (txt.match (reg1) + "
")؛ / * Expression Reg2 تمام کلمات را پیدا خواهد کرد که با سه حرف دلخواه شروع می شود و با" Vet "* / reg2 \u003d / g / g؛ womb \\ s / g؛ document.write (txt.match (reg2) + "
")؛ txt1 \u003d" در بازیکن OH high premirt "؛ / * expression reg3 همه کلمات را پیدا خواهد کرد که در آن شروع می شود که پس از آن 1 رقمی را دنبال می کند و به پایان می رسد در" Vet "* / var reg3 \u003d / با \\ dvl / g ؛ سند .write (txt1.match (reg3) + "
")؛ // Expression REG4 تمام اعداد را در متن var reg4 \u003d / \\ d / g؛ txt2 \u003d" 5 سال مطالعه، 3 سال شنا، تیراندازی 9 ساله "document.write (txt2.match (Reg4) + "
");

مشاهده سریع

نمادها در براکت های مربع

با استفاده از براکت های مربع [kayu] شما می توانید یک گروه از شخصیت های مورد نیاز خود را مشخص کنید.

نماد ^ در مقابل یک گروه از شخصیت های مربع براکت [^ qd] این نشان می دهد که لازم است همه کاراکترهای الفبای دیگر را جستجو کنیم.

با استفاده از داش (-) بین نمادها در براکت های مربع [AA] شما می توانید طیف وسیعی از کاراکترهایی را که می خواهید تولید کنید تنظیم کنید.

با کمک براکت های مربع، شما همچنین می توانید برای اعداد جستجو کنید.

// تنظیم عبارات منظم REG1 REG1 \u003d / \\ SCO [TDM] \\ s / g؛ // رشته متن txt1 txt1 \u003d "cat spit code kom kommersant" را تنظیم کنید. // تولید با استفاده از بیان منظم REG1 جستجو در خط TXT1 Document.write (TXT1.Match (REG1) + "
")؛ reg2 \u003d / \\ slo [^ tg] / g؛ txt2 \u003d" slot slot slot "؛ document.write (txt2.match (reg2) +"
")؛ reg3 \u003d // g؛ txt3 \u003d" 5 سال مطالعه، 3 سال شنا، تیراندازی 9 ساله "؛ document.write (txt3.match (reg3))؛

مشاهده سریع

کوانت کننده

کوانت کننده - این طراحی به شما اجازه می دهد تا چند بار نماد پیش از آن یا گروهی از شخصیت ها باید در یک تصادف ملاقات کنید.

نحو:

// نماد قبلی باید با X - بار ملاقات کند (ایکس) // نماد پیشین باید از X تا مدتی ملاقات کند (x، y) // نماد قبلی باید حداقل X بار را برآورده کند (ایکس،) // نشان می دهد که نماد پیشین باید 0 یا بیشتر بار رخ دهد * // نشان می دهد که نماد قبلی باید 1 بار یا بیشتر را برآورده کند + // نشان می دهد که نماد پیشین باید 0 یا 1 بار رخ دهد ?


// بیان منظم RV1 RV1 \u003d / Co. (5) WAT / G // تنظیم عبارات منظم RV2 RV2 \u003d / KO (3،) watder / g // تنظیم عبارات منظم RV3 RV3 \u003d / Co. Wat / g // تنظیم منظم RV4 rv4 \u003d / ko؟ water / g // تنظیم عبارات منظم RV5 rv5 \u003d / ko * watder / g // font font نشان می دهد که در آن councidences در متن با استفاده از // عبارات RV1 یافت می شود: Cushka Cat Kooshka Cat Co Coach Koooooh Co -Ooooooooooooooooooooooooooo // Font Font نشان می دهد که در آن متن در هنگام استفاده از // عبارات RV2: Cat Cat Cat Cat koo -Opoo Cooooookhop Coooooooooooohokha // فونت های جسورانه نشان می دهد که در هنگام استفاده از // عبارات RV3: Cushka در متن cusincidents یافت می شود cAT KOOSHKA COOSHOP COOOOKHOKO KOOOOOOOOPOO COOOOOOOOOOOHKA // فونت جسورانه نشان می دهد که متن در متن در هنگام استفاده از // عبارات RV4 یافت می شود: Catch Cat Kooshop Cooooookhok Cooooooookhoka Cooooo -Oookhop Coooooohka // Font Coooooohka // Font Coooooohka // Font نشان می دهد که در آن متن در متن با استفاده از // RV5 عبارات یافت می شود: گربه گربه گربه kooshka kooooooooooo

توجه داشته باشید: اگر می خواهید از هر نماد خاص (مانند * +؟ یا ()) استفاده کنید، چگونه باید به طور معمول در مقابل آن قرار دهید \\.

با استفاده از براکت های گرد

با وارد کردن بخشی از قالب بیان منظم به پرانتز، شما بیان را برای به یاد آوردن تصادف، که توسط این قسمت از قالب یافت می شود، مشخص کنید. تصادف ذخیره شده را می توان بعدا در کد خود استفاده کرد.

به عنوان مثال، بیان منظم / (دیمیتری) \\ Svasiliev / خط "Dmitry Vasilyev" را پیدا خواهید کرد و "Dmitry" Substring را به یاد می آورد.

در مثال زیر، از روش جایگزین () برای تغییر دستور کلمه در متن استفاده می کنیم. برای تجدید نظر به تصادف ذخیره شده، ما از $ 1 و $ 2 استفاده می کنیم.

var regexp \u003d / (دیمیتری) \\ s (vasilyev) /؛ var text \u003d "dmitry vasilyev"؛ var newtext \u003d text.replace (regexp، $ 2 $ 1)؛ document.write (newtext)؛

مشاهده سریع

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

بعضی از مردم با یک مشکل مواجه شدند، فکر می کنند: "اوه، و از عبارات منظم استفاده می کنم." الآن آن ها دو مشکل دارند.
جیمی رونوروفسکی

یوان ما گفت: "قدرت زیادی برای برش یک درخت در سراسر ساختار چوب طول می کشد. برای برنامه ریزی فروپاشی مشکل، کد زیادی مورد نیاز است.
استاد یوان-م، "کتاب برنامه نویسی"

ابزارهای برنامه نویسی و تکنیک ها زنده ماندن و توزیع شده توسط یک روش غیرقانونی-تکاملی. گاهی اوقات آنها زنده ماندن زیبا و هوشمندانه نیستند، اما به سادگی کسانی که در زمینه خود به خوبی کار می کنند - به عنوان مثال، اگر آنها به یک تکنولوژی موفق دیگری متصل شوند.

در این فصل، ما این ابزار را مورد بحث قرار خواهیم داد - عبارات منظم. این یک راه برای توصیف قالب ها در داده های رشته است. آنها یک زبان جداگانه کوچک را ایجاد می کنند که در جاوا اسکریپت و در بسیاری از زبان ها و ابزارهای دیگر موجود است.

منظم منظم بسیار عجیب و غریب است. نحو آنها مرموز است و رابط برنامه در جاوا اسکریپت دست و پا گیر است. اما این یک ابزار قدرتمند برای پردازش تحقیق و ردیف است. با درک آنها، شما تبدیل به یک برنامه نویس کارآمدتر خواهید شد.

ایجاد عبارات منظم

منظم نوع شی است. این می تواند با فراخوانی سازنده regexp یا نوشتن الگوی مورد نظر، احاطه شده توسط Stroces ایجاد شود.

var Re1 \u003d REGEXP جدید ("ABC")؛ var re2 \u003d / abc /؛

هر دو این عبارات منظم یک الگو را نشان می دهند: نماد "A" به دنبال نماد "B" به دنبال نماد "C" است.

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

ورودی دوم، جایی که قالب بین اسلش ها است، سکته های معکوس را به طور متفاوتی پردازش می کند. اول، از آنجا که الگوی به پایان می رسد با یک مسیر مستقیم، پس شما نیاز به قرار دادن معکوس در مقابل اسلب مستقیم که ما می خواهیم در قالب ما وارد شود. علاوه بر این، سکته های معکوس که بخشی از کاراکترهای خاصی از نوع \\ n نیستند ذخیره می شوند (و نه در خطوط نادیده گرفته نمی شوند) و معنای الگو را تغییر می دهند. برخی از شخصیت ها، مانند علامت سوال یا یک به علاوه، اهمیت خاصی در نظم های منظم دارند و اگر شما نیاز به پیدا کردن چنین نمادی دارید، باید مسیر معکوس را آماده کنید.

var eighteenplus \u003d / هجده \\ + /؛

برای دانستن اینکه کدام شخصیت ها نیاز به جلوگیری از اسلش دارید، باید لیستی از تمام کاراکترهای ویژه را به طور منظم یاد بگیرید. در حالی که غیر واقعی است، بنابراین در صورت شک و تردید، فقط معکوس را در مقابل هر نمادی قرار دهید که نامه، تعداد یا فضا نیست.

اتمام تصادف

رگولاتورها روش های متعددی دارند. ساده ترین - تست اگر شما آن را یک رشته بدهید، ارزش بولین را به دست می آورید، گزارش می دهد که آیا خط حاوی ورودی قالب مشخص شده است.

console.log (/ab/.test ("abcde"))؛ // → TRUE CONSOOLE.LOG (/ABC/.TEST ("ABXDE"))؛ // → نادرست

به طور منظم، شامل تنها کاراکترهای غیر اختصاصی، به سادگی نشان دهنده دنباله ای از این شخصیت ها است. اگر ABC جایی در خط است که ما بررسی می کنیم (نه تنها در ابتدا)، آزمون درست خواهد شد.

ما به دنبال مجموعه ای از شخصیت ها هستیم

برای پیدا کردن اینکه آیا رشته ABC شامل، با IndexOf امکان پذیر است. به طور منظم به شما اجازه می دهد تا بیشتر بروید و الگوهای پیچیده تر را تشکیل دهید.

فرض کنید ما باید هر عدد را پیدا کنیم. هنگامی که مجموعه ای از کاراکترها را در براکت های مربع به طور منظم تنظیم می کنیم، این بدان معنی است که این قسمت از این بیان با هر یک از شخصیت های براکت همخوانی دارد.

هر دو عبارات در خطوط حاوی رقم هستند.

console.log (// / test ("در سال 1992"))؛ // → true console.log (// / / "در سال 1992))؛ // → درست است.

در براکت های مربع، خط تیره بین دو کاراکتر برای مشخص کردن محدوده کاراکترها استفاده می شود، جایی که توالی به کدگذاری یونیکد تنظیم می شود. نمادهای 0 تا 9 به سادگی در یک ردیف وجود دارد (کدهای 48 تا 57)، بنابراین همه آنها را ضبط می کند و با هر رقمی همخوانی دارد.

چندین گروه کاراکتر دارای کاهش داخلی خود هستند.

\\ d هر رقمی
\\ w نماد الفبایی
نماد پتو (فضا، برگه، ترجمه ردیف، و غیره)
\\ d یک رقم نیست
\\ w نماد الفبایی نیست
\\ s نماد خالی نیست
. هر نماد، به جز خط ترجمه

به این ترتیب، شما می توانید از فرمت تاریخ و زمان مانند 30-01-2003 15:20 با بیان زیر بپرسید:

var dateTime \u003d / \\ d \\ d- \\ d \\ d- \\ d \\ d \\ d \\ d \\ d \\ d: \\ d \\ d /؛ console.log (dateTime.Test ("30-01-2003 15:20")؛ // → True Console.Log (DateTime.Test ("30 ژانویه 2003 15:20"))؛ // → نادرست

به نظر می رسد وحشتناک، درست است؟ بیش از حد بسیاری از لایه های معکوس، که آن را دشوار درک الگو. بعدها ما کمی آن را بهبود خواهیم داد.

سکته های معکوس نیز می تواند در براکت های مربع استفاده شود. به عنوان مثال، [\\ d] به معنای هر رقمی یا نقطه است. توجه داشته باشید که نقطه در داخل مربع براکت های مربع ارزش ویژه خود را از دست می دهد و به سادگی به نقطه تبدیل می شود. همین امر مربوط به سایر کاراکترهای خاص، نوع + است.

یک مجموعه از کاراکترها را عوض کنید - یعنی، بگویم که شما باید هر شخصیتی را پیدا کنید، به جز کسانی که در مجموعه - شما می توانید علامت را بلافاصله پس از براکت مربع باز کنید.

var nonbrinary \u003d / [^ 01] /؛ CONSOLE.LOG (NOTBARY.TEST ("1100100010100110"))؛ // → Console.Log نادرست (NOTBARY.TEST ("110010001010200110"))؛ // → درست است.

ما بخشی از قالب را تکرار می کنیم

ما می دانیم که چگونه یک رقم را پیدا کنیم. و اگر ما نیاز به پیدا کردن تعداد به طور کامل - دنباله ای از یک یا چند رقم؟

اگر بعد از چیزی در علامت منظم + قرار دهید، این بدان معناست که این عنصر می تواند بیش از یک بار تکرار شود. / \\ d + / به معنای یک یا چند رقم است.

console.log (/ "\\ d +" /. تست ("123" "))؛ // → True Console.Log (/ "\\ d +" /. تست ("" ""))؛ // → Console.Log نادرست (/ "\\ d *" /. تست ("123" "))؛ // → True Console.Log (/ "\\ d *" /. تست ("" ""))؛ // → درست است.

در ستاره ها * مقدار تقریبا یکسان است، اما این اجازه می دهد تا قالب به صفر بارگیری شود. اگر بعد از چیزی ستاره ها ایستاده باشد، پس هرگز از الگو جلوگیری نمی کند تا قالب را در رشته پیدا کند - این به سادگی صفر صفر است.

علامت سوال باعث می شود بخشی از قالب اختیاری، یعنی آن، می تواند صفر یا یک بار را برآورده کند. در مثال زیر، نماد U ممکن است رخ دهد، اما قالب زمانی که آن نیست، همخوانی دارد.

VAR همسایه \u003d / همسایه؟ r /؛ Console.Log (همسایه .Test ("همسایه"))؛ // → True Console.Log (همسایه .Test ("همسایه"))؛ // → درست است.

برای تعیین تعداد دقیق زمان هایی که الگو باید برآورده شود، براکت های فرفری استفاده می شود. (4) پس از عنصر به این معنی است که باید در خط 4 بار ملاقات کند. شما همچنین می توانید فاصله را تنظیم کنید: (2.4) به این معنی است که عنصر باید حداقل 2 و نه بیش از 4 بار برآورده شود.

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

var dateTime \u003d / \\ d (1،2) - \\ d (1،2) - \\ d (4) \\ d (1،2): \\ d (2) /؛ console.log (dateTime.Test ("30-1-2003 8:45"))؛ // → درست است.

شما می توانید از فواصل با انتهای باز استفاده کنید، یکی از اعداد را کاهش دهید. (، 5) به این معنی است که الگو می تواند از صفر تا پنج بار، و (5،) - از پنج یا بیشتر.

گروه بندی اشتراک

برای استفاده از * یا + اپراتورهای چندگانه بلافاصله، شما می توانید از پرانتز استفاده کنید. بخشی از منظم، محصور شده در براکت ها، یک عنصر از نقطه نظر اپراتورها محسوب می شود.

var cartooncrying \u003d / boo + (ho +) + / i؛ console.log (cartooncrying.test ("boohoooohoohooo"))؛ // → درست است.

مزایای اول و دوم شامل تنها نامه های دوم در مورد کلمات Boo و Hoo است. سوم + به یک گروه کامل (Ho +) اشاره دارد، پیدا کردن یک یا چند چنین توالی.

نامه ای که در انتهای این بیان قرار می گیرد، به طور منظم به ثبت نام نماد حساسیت می کند، به طوری که B با b همخوانی دارد.

همزمان ها و گروه ها

روش تست ساده ترین روش چک کردن تنظیم کننده ها است. او فقط گزارش می دهد که آیا تصادفی پیدا شده است یا نه. رگولاتورها یکی دیگر از روش های EXEC را دارند، که اگر هیچ چیز یافت نشد، NULL را بازگرداند، در غیر این صورت جسم با اطلاعات مربوط به تصادف بازمی گردد.

var Match \u003d / INFACE / "یک دو 100)؛ console.log (بازی)؛ // → ["100"] console.log (match.index)؛ // → 8

یک شیء EXEC بازگشت دارای یک ویژگی شاخص است که حاوی تعداد کاراکتر است که از آن تصادفی اتفاق افتاده است. به طور کلی، جسم به نظر می رسد مانند یک آرایه از رشته ها، جایی که عنصر اول یک رشته است که به یک تصادف بررسی شد. به عنوان مثال، این دنباله ای از ارقام ما به دنبال آن خواهد بود.

رشته ها یک روش مسابقه ای دارند که در مورد یکسان کار می کنند.

console.log ("یک دو 100" .match (/ \\ d + / /))؛ // → ["100"]

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

var quotedtext \u003d / "([^"] *) "/؛ console.log (quotedtext.exec (" او گفت "سلام" ")؛ // → [" سلام ""، "سلام"]

هنگامی که گروه در همه یافت نشد (به عنوان مثال، اگر علامت سوال پشت سر آن باشد)، موقعیت آن در آرایه شامل undefined است. اگر گروه چندین بار همزمان بود، پس در آرایه تنها آخرین تصادف خواهد بود.

console.log (/ بد (ly)؟ /. exec ("بد")؛ // → ["بد"، undefined] console.log (/ (/ d) + /. exec (123))؛ // → ["123"، "3"]

گروه ها برای استخراج قطعات بخش مفید هستند. اگر ما فقط نیاز به بررسی اینکه آیا خط تاریخ در خط است، و آن را حذف کنید و یک شی را نشان دهید که تاریخ را نشان می دهد، ما می توانیم به تعدادی از اعداد به پرانتز وارد کنیم و یک تاریخ از EXEC را انتخاب کنیم.

اما برای شروع با یک دفع کوچک که در آن ما روش ترجیحی ذخیره تاریخ و زمان در جاوا اسکریپت را یاد می گیریم.

نوع تاریخ

جاوا اسکریپت دارای نوع استاندارد برای تاریخ است - یا به جای آن، لحظات در زمان. این تاریخ نامیده می شود. اگر فقط یک شی تاریخ را از طریق جدید ایجاد کنید، تاریخ و برنامه فعلی را دریافت خواهید کرد.

console.log (تاریخ جدید ())؛ // → خورشید نوامبر 09 2014 00:07:57 GMT + 0300 (CET)

شما همچنین می توانید یک شی حاوی زمان مشخصی ایجاد کنید.

Console.Log (تاریخ جدید (2015، 9، 21))؛ // → Wed Oct 21 2015 00:00:00 GMT + 0300 (CET) Console.Log (تاریخ جدید (2009، 11، 9، 12، 59، 59، 999))؛ // → Wed Dec 09 2009 12:59:59 GMT + 0300 (CET)

جاوا اسکریپت از توافقنامه ای استفاده می کند که در آن اعداد با خراش شروع می شود و تعداد روزها از واحد. این احمقانه و مسخره است. برو بالا.

چهار استدلال آخر (ساعت، دقیقه، ثانیه و میلی ثانیه) اختیاری هستند و در غیاب برابر صفر است.

برچسب های زمانی به عنوان تعداد میلی ثانیه که از اوایل دهه 1970 گذشت، ذخیره می شوند. برای آن زمان تا سال 1970، تعداد منفی استفاده می شود (این به دلیل توافق زمان یونیکس است که در آن زمان ایجاد شده است). روش GetTime از شیء تاریخ این شماره را باز می کند. به طور طبیعی بزرگ است.
Console.Log (تاریخ جدید (2013، 11، 19) .gettime ())؛ // → 1387407600000 console.log (تاریخ جدید (1387407600000))؛ // → Thu Dec 19 2013 00:00:00 GMT + 0100 (CET)

اگر شما یک طرح تاریخی را مشخص کنید، آن را به عنوان تعدادی از میلی ثانیه درک می کنید. شما می توانید مقدار فعلی میلی ثانیه را با ایجاد شیء تاریخ و فراخوانی روش GetTime، یا با فراخوانی تاریخ، دریافت کنید.

شیء تاریخ برای استخراج اجزای آن، Getyrear، GetMonth، GetDate، Gethours، GetMinutes و Geteconds است. همچنین یک روش Getyear وجود دارد که یک کد دو رقمی نسبتا بی فایده را به دست می آورد، نوع 93 یا 14 را تایپ می کند.

با پایان دادن به بخش های لازم از قالب به پرانتز، می توانیم یک شیء تاریخ را مستقیما از رشته ایجاد کنیم.

FindDate (رشته) (var dateTime \u003d / (\\ d (1،2)) - (\\ d (1،2)) - (\\ d (4)) /؛ var match \u003d datetime.exec (رشته)؛ بازگشت تاریخ جدید (شماره (مسابقه)، شماره (مسابقه) - 1، شماره (مسابقه))؛) CONSOLE.LOG (Findate ("30-1-2003"))؛ // → Thu 30 ژانویه 2003 00:00:00 GMT + 0100 (CET)

مرزهای کلمه و ردیف

متأسفانه، FindDate همچنین با خوشحالی یک تاریخ بی معنی 00-1-3000 را از خط "100-1-30000" حذف می کند. تصادف ممکن است در هر نقطه از خط اتفاق بیافتد، بنابراین در این مورد فقط از نماد دوم شروع می شود و به پایان رسیده است.

اگر ما باید یک تصادف را مجبور کنیم کل خط کل را بگیریم، از برچسب ها استفاده می کنیم. ^ همزمان با شروع خط، و $ با پایان است. بنابراین، / ^ \\ d + $ / همزمان با یک رشته متشکل از تنها یک یا چند رقم، / ^! / هماهنگ با شریک شروع با علامت تعجب، و / x ^ / مطابقت با هر خط (قبل از شروع خط آن را نمی توان X).

اگر، از سوی دیگر، ما فقط باید اطمینان حاصل کنیم که تاریخ شروع و پایان دادن به لبه کلمه، ما از برچسب \\ b استفاده می کنیم. مرز کلمه ممکن است شروع یا پایان رشته یا هر مکان خط باشد، جایی که از یک طرف نماد عددی دیجیتال-دیجیتال \\ w، و از سوی دیگر - نه الفبایی.

console.log (/ /cat/.test ("concatenate"))؛ // → true console.log (/ / / \\ bcat \\ b / .test ("concatenate"))؛ // → نادرست

توجه داشته باشید که برچسب مرزی نماد نیست. این فقط یک محدودیت است که نشان می دهد که تصادف اتفاق می افتد تنها اگر شرایط خاصی انجام شود.

قالب ها با انتخاب

فرض کنید لازم است دریابید که آیا متن نه تنها یک عدد نیست و عدد به دنبال خوک، گاو یا مرغ در یک عدد یا چند عدد است.

این امکان وجود دارد که سه مرتبه بنویسید و آنها را به نوبه خود بررسی کنید، اما راه بهتر وجود دارد. نماد | نشان می دهد انتخاب بین قالب ها در سمت چپ و به سمت راست آن. و ما می توانیم موارد زیر را بگوییم:

var animalcount \u003d / \\ b \\ d + (خوک | گاو | مرغ) S؟ \\ B /؛ console.log (animalcount.test ("15 خوک"))؛ // → true console.log (animalcount.test (15 pigchickens))؛ // → نادرست

براکت ها بخشی از قالب را محدود می کنند، و شما می توانید بسیاری از اپراتورها را با یکدیگر قرار دهید تا انتخاب بیش از دو گزینه را تعیین کنید.

مکانیزم جستجو

عبارات منظم را می توان به عنوان فلوچارت در نظر گرفت. نمودار زیر آخرین کد حیوانی را توصیف می کند.

این عبارت با رشته همخوانی دارد، اگر بتوانید مسیر را از سمت چپ نمودار به سمت راست پیدا کنید. ما موقعیت فعلی را در ردیف به یاد می آوریم، و هر بار، یک مستطیل را گذرانده ایم، این قسمت از خط را بلافاصله پشت موقعیت ما در آن قرار می دهیم، با محتویات مستطیل همزمان می شود.

بنابراین، بررسی هماهنگی منظم منظم ما در خط "3 خوک" در هنگام عبور از نمودار بلوک به نظر می رسد مانند این:

در موقعیت 4 مرز کلمه وجود دارد، و ما اولین مستطیل را منتقل می کنیم
- شروع با 4 موقعیت ما یک رقم را پیدا می کنیم و مستطیل دوم را می گذرانیم
- در موقعیت 5، یک راه در مقابل مستطیل دوم بسته می شود، و دوم به سمت مستطیل با یک فضای باز می گردد. ما یک فضا داریم، نه یک رقم، و راه دوم را انتخاب می کنیم.
- در حال حاضر ما در موقعیت 6، آغاز "خوک ها"، و در شاخه سه گانه از مسیرها هستیم. هیچ "گاو" یا "مرغ" خط وجود ندارد، اما "خوک" وجود دارد، بنابراین ما این مسیر را انتخاب می کنیم.
- در موقعیت 9 پس از یک شاخه سه گانه، یک راه دور از "S" و سر به آخرین مستطیل با مرز کلمه، و دوم عبور از طریق "S". ما "S" داریم، بنابراین ما به آنجا می رویم.
- در موقعیت 10، ما در پایان خط، و تصادف تنها می تواند مرز کلمه. پایان خط مرزی محسوب می شود و ما از طریق آخرین مستطیل عبور می کنیم. و بنابراین ما با موفقیت قالب ما را پیدا کردیم.

در اصل، عبارات منظم به شرح زیر عمل می کنند: الگوریتم در ابتدای خط شروع می شود و تلاش می کند تا یک تصادف را پیدا کند. در مورد ما، یک مرز از کلمه وجود دارد، بنابراین او اولین مستطیل را می گذراند - اما هیچ اعداد وجود ندارد، بنابراین او در مستطیل دوم متوقف می شود. سپس او به نماد دوم در خط حرکت می کند و در حال تلاش برای پیدا کردن یک تصادف وجود دارد ... و به همین ترتیب تا زمانی که یک تصادف را پیدا کند یا به پایان خط برسد، در این صورت تصادف یافت نشد.

عقب نشینی

به طور منظم / \\ b (+ b (+ b | \\ d + | [\\ da-f] h) \\ b / همزمان با یک عدد دودویی به دنبال B یا با شماره دهدهی بدون پسوند یا هگزادسیمال (اعداد از 0 تا 9 یا نمادها از A به H)، به دنبال h. نمودار مربوطه:

در جستجوی تصادف، ممکن است اتفاق بیفتد که الگوریتم در مسیر بالا (شماره باینری) رفت، حتی اگر چنین تعداد در خط وجود داشته باشد. اگر یک رشته "103" وجود داشته باشد، واضح است که تنها رسیدن به شکل 3 الگوریتم درک می کند که او در مسیر اشتباه است. به طور کلی، این خط با منظم، فقط در این شاخه همخوانی دارد.

سپس الگوریتم باعث نابودی می شود. در چنگال، او موقعیت فعلی را به یاد می آورد (در مورد ما، آغاز خط، بلافاصله پس از مرز کلمه) به طوری که شما می توانید به عقب برگردید و راه دیگری را امتحان کنید اگر انتخاب کار نمی کند. برای یک رشته "103" پس از دیدار با سه نفر برتر، او بازگشت و سعی کنید راه را برای اعداد اعشاری منتقل کنید. این کار خواهد کرد، بنابراین تصادف پیدا خواهد شد.

الگوریتم متوقف می شود به محض این که تصادفی کامل پیدا شود. این به این معنی است که حتی اگر گزینه های متعددی بتوانند رویکرد داشته باشند، تنها یکی از آنها استفاده می شود (به ترتیب که در آن به طور منظم ظاهر می شود).

رول ها هنگام استفاده از اپراتورهای تکرار مانند + و * رخ می دهد. اگر شما به دنبال / ^ * هستید. * / در رشته abcxe، بخشی از منظم. * تلاش می کند کل خط را جذب کند. الگوریتم پس از آن متوجه خواهد شد که او همچنین نیاز به "X" دارد. از آنجا که هیچ "X" پس از پایان خط نیست، الگوریتم سعی خواهد کرد به دنبال یک تصادف، پرتاب به یک شخصیت. پس از ABCX، هیچ X نیز وجود ندارد، پس او دوباره به عقب برگردد، در حال حاضر به Substring ABC. و پس از خط، او X را پیدا می کند و گزارش ها را در مورد تصادفات موفق، در موقعیت های 0 تا 4 گزارش می دهد.

شما می توانید به طور منظم بنویسید، که به چندین رکود منجر می شود. چنین مشکلی زمانی رخ می دهد که قالب ممکن است با مجموعه داده های ورودی از روش های مختلف همخوانی داشته باشد. به عنوان مثال، اگر ما اشتباه را هنگام نوشتن به طور منظم برای اعداد باینری اشتباه کنیم، می توانیم به طور تصادفی چیزی شبیه / (+) + B / بنویسیم.

اگر الگوریتم برای چنین قالب ای در یک ردیف طولانی از nonols و واحدهای که در انتهای "B" شامل نمی شود، ابتدا از طریق حلقه درونی عبور می کند تا اعداد را به پایان برساند. سپس متوجه خواهد شد که در نهایت هیچ "B" وجود ندارد، یک رکورد را برای یک موقعیت قرار می دهد، آن را در حلقه بیرونی انجام می شود، دوباره از دست دادن، سعی کنید به جای دیگری در حلقه درونی بروید .. . و بیشتر به دنبال راه، دوچرخه سواری هر دو لولا. به عبارت دیگر، مقدار کار با هر نماد ردیف دو برابر خواهد شد. حتی برای چندین کاراکتر دوازده، جستجوی اتفاقی زمان زیادی را صرف خواهد کرد.

جایگزین روش

رشته ها یک روش جایگزین دارند که می توانند بخشی از خط رشته دیگری را جایگزین کنند.

Console.log ("پدر" .replace ("P"، "M"))؛ // → MAPA

اولین استدلال می تواند منظم باشد، در این صورت توسط اولین ورودی منظم منظم در رشته جایگزین می شود. هنگامی که گزینه "G" (جهانی، جهانی) به طور منظم اضافه می شود، تمام نوشته ها جایگزین می شوند، و نه فقط اولین

Console.Log ("Borobudur" .replace (//، "a"))؛ // → Barobudur Console.Log ("Borobudur" .replace (// g، "a"))؛ // → باربادار

این امر می تواند گزینه "جایگزین کردن همه" را از طریق یک استدلال جداگانه، یا از طریق یک روش جداگانه جداگانه انتقال دهد. اما متأسفانه، این گزینه از طریق به طور منظم انتقال می یابد.

تمام تنظیم کننده های قدرت هنگام استفاده از مراجع به آنهایی که در رشته گروهی که به طور منظم تنظیم شده اند، افشا می شوند. به عنوان مثال، ما یک رشته حاوی اسامی افراد، یک نام در خط، در فرمت "نام خانوادگی، نام" داریم. اگر ما باید آنها را در مکان ها تغییر دهیم و کاما را حذف کنیم، به طوری که نام نام "نام" است، ما موارد زیر را بنویسیم:

Console.log ("Hopper، Grace \\ NMCCarthy، John \\ Nritchie، Dennis". محل (/ [\\ w] +)، ([\\ w] +) / g، "$ 2 $ 1"))؛ // → Grace Hopper // جان McCarthy // دنیس ریچی

$ 1 و $ 2 در خط جایگزینی به گروهی از کاراکترهای محصور شده در براکت اشاره دارد. $ 1 توسط متن جایگزین شده است که همزمان با گروه اول، 2 دلار - با گروه دوم، و غیره، تا 9 دلار است. کل تصادف در $ & $ موجود است.

شما همچنین می توانید هر دو استدلال دوم را به عنوان یک استدلال دوم انتقال دهید. برای هر جایگزینی، یک تابع ایجاد می شود، استدلال هایی که گروه ها یافت می شوند (و کل تصادف کل خط)، و نتیجه آن به یک رشته جدید وارد می شود.

مثال ساده:

var s \u003d "CIA و FBI"؛ Console.log (S.replace (/ / \\ B (FBI | CIA) \\ b / g، تابع (return str.touppercase ()؛))؛ // → CIA و FBI

اما جالب تر:

Var Stock \u003d "1 لیمو، 2 کابوب، و 101 تخم مرغ"؛ تابع مینوسون (مسابقه، مقدار، واحد) (مقدار \u003d شماره (مقدار) - 1؛ اگر (مقدار \u003d\u003d \u200b\u200b1) // تنها یکی باقی مانده است، حذف "S" در پایان واحد \u003d واحد. 200ice (0، واحد .length - 1)؛ دیگر اگر (مقدار \u003d\u003d \u200b\u200b0) مقدار \u003d "نه"؛ مقدار بازگشت + "" + واحد؛) console.log (/ / (\\ d +) (\\ w +) / g ، منوفر))؛ // → بدون لیمو، 1 کلم، و 100 تخم مرغ

کد رشته را می گیرد، تمام ورودی اعداد را پیدا می کند، به دنبال آن کلمه، و خط را که هر عدد توسط یکی کاهش می یابد، باز می گرداند.

گروه (\\ D +) به مقدار استدلال، a (\\ w +) - در واحد می افتد. تابع مقدار را به شماره تبدیل می کند - و همیشه کار می کند، زیرا قالب ما فقط \\ d + است. و سپس تغییرات را به کلمه انجام می دهد، در صورتی که تنها 1 مورد باقی بماند.

طمع

جایگزین آسان است برای نوشتن یک تابع که حذف تمام نظرات از کد جاوا اسکریپت. در اینجا اولین تلاش است:

تابع تابع (کد) (/ \\ / \\ / \\ / ** | \\ / \\ * [^] * \\ * \\ // g، "")؛)؛ console.log (StripComments ("1 + / * 2 * / 3 "))؛ // → 1 + 3 console.log (StripComments ("x \u003d 10؛ // ده!"))؛ // → X \u003d 10؛ Console.Log (StripComments ("1 / * a * / + / * b * / 1))؛ // → 1 1

بخشی در مقابل اپراتور "یا" همزمان با دو اسکله، به دنبال هر تعداد شخصیت، به جز نماد ترجمه ردیف. قطعه ای که نظرات چند خط را حذف می کند پیچیده تر است. ما از [^] استفاده می کنیم، I.E. هر شخصیتی که به عنوان راهی برای پیدا کردن هر شخصیت خالی نیست. ما نمی توانیم از این نکته استفاده کنیم، زیرا نظرات بلوک در خط جدید ادامه می یابد و نماد ترجمه خط با نقطه ای مطابقت ندارد.

اما خروجی مثال قبلی نادرست است. چرا؟

بخش [^] * ابتدا سعی کنید شخصیت های بسیاری را به عنوان آن را ضبط کنید. اگر، به دلیل این، بخش بعدی به طور منظم پیدا کردن مختصات، آن را به یک شخصیت رول و دوباره امتحان کنید. در مثال، الگوریتم تلاش می کند کل رشته را ضبط کند و سپس به عقب برگردد. سقوط در 4 کاراکتر پیش، او در خط * / - و این چیزی نیست که ما به دست آوردیم. ما می خواستیم تنها یک نظر را ضبط کنیم، و نه از طریق خط و پیدا کردن آخرین نظر.

به همین دلیل، ما می گوییم که اپراتورهای تکراری (+، *،؟، و ()) حریص، یعنی، آنها برای اولین بار آنها را می گیرند، و سپس به عقب برگردند. اگر بعد از چنین اپراتور (+؟، *؟، ()، ()؟)، آنها را به صورت غیرقانونی تبدیل می کنید و شروع به پیدا کردن کوچکترین ورودی های احتمالی می کنید.

و این چیزی است که ما نیاز داریم. مجبور کردن ستاره ها برای پیدا کردن مختصات در کمترین تعداد ممکن از نمادهای دوخت، ما تنها یک بلوک نظرات را جذب می کنیم و هیچ چیز دیگری را جذب نمی کنیم.

تابع تابع (کد) (بازگشت کد .replace (/ \\ //.** | \\ / \\ * [^] *؟ \\ * \\ // g، "")؛)؛) console.log (StripComments ("1 / * a * / + / * b * / 1))؛ // → 1 + 1

بسیاری از خطاها هنگام استفاده از اپراتورهای حریص به جای بی اعتمادی رخ می دهند. هنگام استفاده از اپراتور تکرار، ابتدا همیشه گزینه اپراتور Unjudene را در نظر بگیرید.

پویایی ایجاد اشیاء regexp

در برخی موارد، قالب دقیق در هنگام نوشتن کد ناشناخته است. به عنوان مثال، شما باید نام کاربری را در متن جستجو کنید و آن را به تاکید برسید. از آنجا که شما فقط پس از شروع برنامه یاد می گیرید، نمی توانید از رکورد با انباشته استفاده کنید.

اما شما می توانید یک رشته را ساخت و از سازنده regexp استفاده کنید. به عنوان مثال:

var name \u003d "هری"؛ var text \u003d "و هری در اسکار پیشانی"؛ var regexp \u003d جدید regexp ("\\\\ b (" + نام + ") \\\\ b"، "gi")؛ console.log (text.replace (regexp، "$ 1_"))؛ // → و در _garry_ در اسکار پیشانی.

هنگام ایجاد مرزها، کلمه باید از دو لایه استفاده کند، زیرا ما آنها را در یک خط عادی نوشتیم و نه به طور منظم با پله های مستقیم. استدلال دوم برای regexp شامل گزینه هایی برای تنظیم کننده ها - در مورد ما "GI"، I.E. جهانی و ثبت نام مستقل.

اما اگر نام "DEA + HLRD" باشد (اگر کاربر ما Kulkhazker باشد) چیست؟ به عنوان یک نتیجه، ما به طور منظم به طور منظم به طور منظم دریافت می کنیم، که در خط مقدماتی پیدا نمی شود.

ما می توانیم به هر نمادی اضافه کنیم که ما دوست نداریم. ما نمی توانیم سکته های معکوس را در مقابل حروف اضافه کنیم، زیرا \\ b یا \\ n یک مخلوط خاص است. اما شما به راحتی می توانید در مقابل هر نمادهای دیجیتال حروف الفبا گیر کرده باشید.

var name \u003d "DEA + HLRD"؛ var text \u003d "این DEA + HLRD همه را دریافت کرد."؛ var farped \u003d name.replace (/ [^ \\ w \\ s] / g، "\\\\ $ &")؛ var regexp \u003d regexp جدید ("\\\\ b (" + فرار + ") \\\\ b"، "gi")؛ console.log (text.replace (regexp، "$ 1_"))؛ // → این _dea + hld_ همه را دریافت کرد.

روش جستجو

روش IndexOf را نمی توان با منظم استفاده کرد. اما یک روش جستجو وجود دارد که فقط منتظر منظم است. مانند IndexOf، این شاخص اولین ورودی یا -1 را باز می کند، اگر این اتفاق نیافتد.

console.log ("کلمه" .search (/ s /))؛ // → 2 console.log (". جستجو (/ s /))؛ // → -1.

متأسفانه این روش غیرممکن است که روش را برای جستجو برای یک تصادف جستجو کنیم، با شروع یک افست خاص (همانطور که می توان با IndexOf انجام داد). مفید خواهد بود.

املاک Lastindex

روش EXEC یا اجازه نمی دهد یک راه مناسب برای شروع جستجو از یک موقعیت مشخص در رشته. اما یک راه ناراحت کننده است.

تنظیم کننده های شیء دارای خواص هستند. یکی از آنها یک منبع حاوی یک رشته است. یکی دیگر از Lastindex است که کنترل می کند، در برخی از شرایطی که جستجوی بعدی رویدادها آغاز خواهد شد.

این شرایط شامل نیاز به حضور Global G گزینه می شود و این واقعیت که جستجو باید با استفاده از روش EXEC استفاده شود. یک راه حل معقول تر به سادگی مجاز به اجازه دادن به یک استدلال اضافی برای انتقال به EXEC، اما عقلانیت یک ویژگی اساسی در رابط تنظیم کننده های جاوا اسکریپت نیست.

var pattern \u003d / y / g؛ pattern.lastindex \u003d 3؛ var match \u003d pattern.exec ("xyzzy")؛ console.log (match.index)؛ // → 4 console.log (pattern.lastindex)؛ // → 5

اگر جستجو موفقیت آمیز بود، تماس EXEC به روز رسانی ملک Lastindex را به روز می کند، به طوری که پس از ورود به سیستم، موقعیتی را نشان می دهد. اگر موفقیت وجود نداشت، LastIndex در صفر نصب شده است - و همچنین LastIndex در شی فقط ایجاد شده است.

هنگام استفاده از متغیرهای جهانی به طور منظم و چندگانه EXEC، این به روز رسانی خودکار LastIndex می تواند منجر به مشکلات شود. شما به طور مرتب می توانید یک جستجوی را از موقعیت باقی مانده از تماس قبلی شروع کنید.

var digit \u003d / \\ d / g؛ console.log (digit.exec ("در اینجا این است: 1"))؛ // → ["1"] console.log (digit.exec ("و در حال حاضر: 1"))؛ // → null

یکی دیگر از اثر جالب گزینه G این است که کار روش مسابقه را تغییر می دهد. هنگامی که آن را با این گزینه نامیده می شود، به جای بازگشت یک آرایه، شبیه به نتیجه کار EXEC، تمام ورودی های قالب را در رشته پیدا می کند و یک آرایه را از بستر یافت می شود.

console.log ("موز" .match (/ en / g))؛ // → [""، "a"]

با دقت با متغیرهای جهانی. در مواردی که آنها مورد نیاز هستند - تماس های جایگزین یا مکان هایی که در آن شما به طور خاص از Lastindex استفاده می کنید - شاید همه مواردی که باید اعمال شود.

چرخه با ورود

یک کار معمول این است که از طریق تمام نوشته های قالب در رشته بروید تا بتوانید با استفاده از Lastindex و Exec به شیء مسابقه در بدن چرخه دسترسی داشته باشید.

var input \u003d "دوختن با 3 عدد در آن ... 42 و 88."؛ var number \u003d / \\ b (\\ d +) \\ b / g؛ بازی Var؛ در حالی که (match \u003d number.exec (input)) console.log ("یافت"، بازی، "در"، match.index)؛ // → یافت شده 3 تا 14 // 42 تا 33/33 یافت شد 88 تا 40

این واقعیت که تخصیص ارزش به ارزش اختصاص داده می شود. با استفاده از match \u003d re.exec (input) طراحی به عنوان یک شرط در چرخه در حالی که ما یک جستجو را در ابتدای هر تکرار تولید می کنیم، ما نتیجه را در یک متغیر ذخیره می کنیم و چرخه را تمام می کنیم، زمانی که همه موارد همزمان یافت می شود.

شنوایی فایل های INI

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

SearchEngine \u003d http: //www.google.com/search؟ q \u003d $ 1 spitefulness \u003d 9.7؛ قبل از نظرات، نقطه قرار داده شده است؛ هر بخش مربوط به یک دشمن جداگانه fullname \u003d لری Doe type \u003d bychar از وب سایت مهد کودک \u003d http: //wwww.geocities.com/capecanaveral/11451 fullname \u003d gargamel type \u003d outputdir / marijn / enemies / gargamel

فرمت دقیق فایل (که به طور گسترده ای مورد استفاده قرار می گیرد، و معمولا به نام INI نامیده می شود)، زیر:

رشته های خالی و ردیف های شروع با یک semicolon نادیده گرفته می شود
- ردیف های محصور شده در مربع های مربع یک بخش جدید را شروع می کنند
- ردیف های حاوی شناسه الفبایی، به دنبال \u003d، اضافه کردن تنظیمات در این بخش.

هر چیز دیگری داده های نادرست است.

وظیفه ما این است که چنین رشته ای را به یک مجموعه ای از اشیاء تبدیل کنیم، هر کدام با ویژگی نام و آرایه ای از تنظیمات. برای هر بخش، شما نیاز به یک شی، و یکی دیگر - برای تنظیمات جهانی از بالای فایل.

از آنجا که فایل باید خط جدا شود، بد نیست که با شکستن فایل به رشته شروع شود. برای انجام این کار، در فصل 6، ما از string.split ("\\ n") استفاده کردیم. برخی از عملیات برای انتقال خط نه یک شخصیت \\ n و دو - \\ r \\ n استفاده می شود. از آنجا که روش تقسیم به طور منظم به عنوان یک استدلال به طور منظم طول می کشد، می توانیم خط را با استفاده از عبارت / \\ r؟ \\ n /، اجازه و تک \\ n و \\ r \\ n بین ردیف تقسیم کنیم.

تابع Parseini (String) (// شروع از یک شی شامل تنظیمات سطح بالا تغییرات سطح بالا \u003d (نام: null، fields :)؛ certifications var \u003d؛ string.split (/ \\ r؟ \\ n /). foreach (function خط) (var match؛ اگر (/ \\ ^ / s * (؛؛. *)؟ $ /. تست (خط)) (بازگشت؛) دیگری اگر (match \u003d line.match (/ ^[_..*: ) $ $ /) (currentsectionce \u003d (نام: مسابقه، زمینه ها :)؛ دسته بندی ها .push (currentsection)؛) دیگری اگر (match \u003d line.match (/ ^ (\\ w +) \u003d (. *) $ /) ) (COLEENTRESSECTIONSECTIONSECTIONSECTIONSFUSH ((نام: بازی، ارزش: مطابقت)؛) دیگر (پرتاب خطای جدید ("Stitch" + Line + "" شامل داده های نادرست است. ")؛)؛)؛)؛)؛)؛

کد تمام خطوط را با به روز رسانی بخش فعلی "بخش فعلی" عبور می دهد. در ابتدا بررسی می شود که آیا ممکن است خط را نادیده بگیرد، با کمک به طور منظم / \\؛. * *)؟ $ /. در نظر بگیرید که چگونه کار می کند؟ بخشی بین براکت ها با نظرات همخوانی دارد، EH؟ آیا این به طور منظم با خطوط متشکل از چند فضایی همخوانی دارد.

اگر رشته یک نظر نیست، کد بررسی می کند که آیا یک بخش جدید را شروع می کند. اگر بله، یک شی جدید را برای بخش فعلی ایجاد می کند که تنظیمات بعدی آن اضافه شده است.

آخرین ویژگی معنی دار یک ردیف یک راه اندازی عادی است و در این مورد به شی فعلی اضافه شده است.

اگر هیچ گزینه ای کار نکرده باشد، تابع یک خطا را ارائه می دهد.

توجه داشته باشید که چگونه استفاده مکرر ^ و $ مراقبت از این واقعیت است که بیان همزمان با کل رشته کل، و نه با بخشی. اگر از آنها استفاده نکنید، کد به عنوان یک کل کار خواهد کرد، اما گاهی اوقات نتایج عجیب و غریب وجود خواهد داشت، و این خطا برای پیگیری دشوار خواهد بود.

طراحی اگر طراحی (match \u003d string.match (...)) شبیه به یک ترفند است که از تخصیص به عنوان یک شرط در چرخه استفاده می کند. اغلب شما نمی دانید که تماس مسابقه موفقیت آمیز خواهد بود، بنابراین شما می توانید به شیء حاصل تنها در داخل بلوک که چک می کند دسترسی داشته باشید. بنابراین، اگر زنجیره چک زنجیره ای را شکست ندهیم، نتیجه جستجو متغیر را تعیین می کنیم و بلافاصله از این تخصیص به عنوان چک استفاده می کنیم.

نمادهای بین المللی

با توجه به اجرای اولیه اولیه زبان و تثبیت بعدی این پیاده سازی "در گرانیت"، جاوا اسکریپت به طور منظم با نمادهای که به زبان انگلیسی رخ نمی دهد، احمقانه است. به عنوان مثال، نماد "نامه" از نقطه نظر تنظیم کننده های جاوا اسکریپت می تواند یکی از 26 حرف الفبای انگلیسی باشد و به دلایلی حتی تأکید شود. حروف نوع é یا β، منحصر به فرد بودن نامه، با \\ w همخوانی ندارند (و هماهنگ با \\ W، یعنی با یک حرف نه).

بر اساس یک تصادف عجیب و غریب، از لحاظ تاریخی (فضا) با تمام کاراکترهایی که به عنوان یک فضای ضروری یا جداساز واکه مغولستان محسوب می شوند، هماهنگ می شود.

در برخی از پیاده سازی ها، رگولاتورها به زبان های دیگر یک نحو خاص برای جستجو برای دسته های خاص از شخصیت های یونیکد، مانند "تمام حروف بزرگ"، "تمام علائم نقطه گذاری" یا "شخصیت های کنترل" دارند. برنامه هایی برای اضافه کردن دسته های موجود در جاوا اسکریپت وجود دارد، اما به نظر می رسد به زودی اجرا می شود.

نتیجه

منظم بودن منظم اشیاء هستند که الگوهای جستجو را در خطوط نشان می دهند. آنها از نحو خود برای بیان این الگوها استفاده می کنند.

/ ترتیب ABC / نماد
// هر نماد از لیست
/ [^ abc] / هر شخصیت به جز کاراکترها از لیست
// هر نماد شکاف
/ x + / یک یا چند رخدادهای الگو x
/ x +؟ / یک یا چند رخداد، ارواح
/ x * / صفر یا بیشتر رخدادهای
/ x؟ / صفر یا یک ورودی
/ x (2.4) / از دو تا چهار رخداد
/ (ABC) / گروه
/ a | b | c / هر یک از چند قالب
/ \\ d / هر رقمی
/ \\ w / هر نماد الفبایی ("نامه")
/ \\ s / هر نماد خالی
/. / هر نماد، به جز ردیف ترجمه
/ \\ B / کلمه مرزی
/ ^ / شروع خط
/ $ / پایان خط

به طور منظم یک روش آزمون دارد تا بررسی شود که آیا یک الگوی در یک رشته وجود دارد. یک روش EXEC وجود دارد که یک آرایه حاوی تمام گروه های یافت شده را باز می کند. توده دارای یک ویژگی شاخص است، جایی که تعداد شخصیت هایی که از آن تصادف اتفاق افتاده است.

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

تنظیم کننده ها دارای تنظیمات هستند که پس از یک برش بسته بندی نوشته شده اند. من گزینه من به طور منظم وابسته به موارد، و گزینه G G باعث می شود آن را جهانی، که، در میان چیزهای دیگر، روش جایگزین را جایگزین تمام چیزهای موجود، و نه فقط اولین.

طراح Regexp را می توان برای ایجاد ردیف های منظم استفاده کرد.

منظم - یک ابزار تیز با یک دسته ناراحت کننده است. آنها بعضی از وظایف را به شدت ساده می کنند و می توانند در حل سایر وظایف پیچیده غیر قابل کنترل شوند. بخشی از توانایی استفاده منظم منظم این است که قادر به مقاومت در برابر وسوسه به چیزهایی که آنها در نظر گرفته نشده است.

تمرین

ناگزیر، هنگام حل وظایف، موارد غیر قابل درک را خواهید داشت و گاهی اوقات می توانید ناامید شوید، دیدن رفتار غیر قابل پیش بینی برخی از تنظیم کننده ها. گاهی اوقات آن را به بررسی رفتار منظم از طریق خدمات آنلاین DebuggeX.com کمک می کند، جایی که می توانید تجسم خود را مشاهده کنید و با اثر دلخواه مقایسه کنید.
گلف منظم
"گلف" در کد بازی نامیده می شود که در آن شما باید یک برنامه داده شده را با حداقل تعداد کاراکترها بیان کنید. گلف منظم یک تمرین عملی در نوشتن کوچکترین تنظیم کننده های ممکن برای جستجوی یک قالب داده شده است و تنها آن.

برای هر یک از مدار، به طور منظم بنویسید تا آنها را در ردیف بررسی کنید. به طور منظم باید این زیربنای مشخص شده را پیدا کنید. نگران نباشید در مورد مرزهای کلمات، اگر به خصوص ذکر نشده باشد. هنگامی که به طور منظم کار می کنید، سعی کنید آن را کاهش دهید.

ماشین و گربه.
- پاپ و پروانه
- Ferret، Ferry، و Ferrari
- هر کلمه ای که با iOS پایان می یابد
- فضا، به دنبال آن نقطه نقطه، کاما، کولون یا نقطه کاما.
- طول کلمه شش حرف
- کلمه بدون حروف الکترونیکی

// vermiy منظم خود را وارد کنید (/.../، ["ماشین من"، "گربه های بد"]، ["camper"، "هنر بالا"]؛ تأیید (/.../، ["pop culture"، "props mad props"]، ["plop"])؛ تأیید (/.../، ["Ferret"، "Ferry"، "Ferrari"]، ["Ferrum"، "انتقال A"])؛ تأیید (/.../، ["چقدر خوشمزه"، "اتاق بزرگ"]، ["ویرانگر"، "آگاهی"])؛ تأیید (/.../، ["نشانه گذاری بد"]، ["فرار از نقطه"])؛ تأیید (/.../، ["hottentotentialtenendenen"]، ["نه"، "hotten tenten tenten"]؛ تأیید (/.../، ["Red Platypus"، "Wobbling Nest"]، ["تخت زمین"، "Learning Ape"])؛ تابع تایید (regexp، بله، نه) (// regeore impined تمرینات ناتمام اگر (regexp.source \u003d\u003d "...") بازگشت؛ YES.Foreach (تابع (ها) (اگر (! regexp.test (s)) کنسول . ؛))؛)

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

با یک قالب که دو مورد از این نقل قول ها را تشخیص می دهد، بیاورید و یک تماس را به روش جایگزین که جایگزین آن می شود، بنویسید.

شماره های دیگر
توالی اعداد را می توان به طور منظم / \\ d + / یافت.

یک عبارت را بنویسید که تنها اعداد ثبت شده در سبک جاوا اسکریپت را پیدا می کند. این باید یک منهای ممکن یا به علاوه قبل از تعداد، نقطه اعشاری، و ضبط نمایشگرهای 5E-3 یا 1E10 نمایشی را حفظ کند - دوباره با یک plus یا منهای احتمالی. همچنین توجه داشته باشید که قبل یا بعد از نقطه لزوما اعداد را تحمل نمی کنند، اما شماره نمی تواند از یک نقطه تشکیل شود. این، 5 یا 5. - اعداد مجاز و یک نقطه به خودی خود - نه.

// منظم منظم را وارد کنید var number \u003d / \u003d ... $ /؛ // tests: ["1"، "-1"، "+15"، "1.55"، ".5"، "5."، "1.3e2"، "1E-4"، "1E + 12"] .oreach (تابع (ها) (اگر (! number.test (s)) console.log ("پیدا نشد" + s + "")؛))؛ ["1A"، "+ -1"، "1.2.3"، "1 + 1"، "1E4.5"، ".5"، "1f5"، "."]. foreach (تابع (ها) (اگر (number.test (s)) console.log ("اشتباه پذیرفته شده" "+ s +" ")؛))؛