{"id":324571,"date":"2021-06-08T15:00:45","date_gmt":"2021-06-08T15:00:45","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=324571"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=324571","title":{"rendered":"\u0414\u0430 \u0445\u0432\u0430\u0442\u0438\u0442 \u0443\u0436\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u041a\u0430\u0440\u043b\u043e\u0432\u0441\u043a\u0438\u0439 \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u044f \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/perldoc.perl.org\/perlre\" rel=\"nofollow noopener noreferrer\">Perl<\/a> \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0433\u043b\u044f\u043d\u044c\u0442\u0435, \u043a\u0430\u043a\u0438\u043c \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043c\u0435\u0439\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/^(?:((?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}(?:\\.(?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}){0,})|(&quot;(?:((?:(?:([\\u{1}-\\u{8}\\u{b}\\u{c}\\u{e}-\\u{1f}\\u{21}\\u{23}-\\u{5b}\\u{5d}-\\u{7f}])|(\\\\[\\u{1}-\\u{9}\\u{b}\\u{c}\\u{e}-\\u{7f}]))){0,}))&quot;))@(?:((?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}(?:\\.(?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}){0,}))$\/gsu<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0443\u0442, \u043f\u0440\u0430\u0432\u0434\u0430, \u0437\u0430\u043a\u0440\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043e\u043a. \u041d\u0443 \u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435!<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h1 id=\"shutki-v-storonu\">\u0428\u0443\u0442\u043a\u0438 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443<\/h1>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/id\/o7\/dw\/ido7dw5d2wxncjkznak_jr8sfkm.jpeg\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u0442\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u043e\u044e \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0441\u0442\u044c. \u041d\u0435 \u0437\u0440\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a. \u0412\u043e\u0442 \u043b\u0438\u0448\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/regex101.com\/\" rel=\"nofollow noopener noreferrer\">https:\/\/regex101.com\/<\/a><\/li>\n<li><a href=\"https:\/\/regexr.com\/\" rel=\"nofollow noopener noreferrer\">https:\/\/regexr.com\/<\/a><\/li>\n<li><a href=\"https:\/\/www.debuggex.com\/\" rel=\"nofollow noopener noreferrer\">https:\/\/www.debuggex.com\/<\/a><\/li>\n<li><a href=\"https:\/\/extendsclass.com\/regex-tester.html\" rel=\"nofollow noopener noreferrer\">https:\/\/extendsclass.com\/regex-tester.html<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0410 \u0441 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u0432\u044b\u0445 \u0444\u0438\u0447\u0435\u0439, \u043e\u043d\u0438 \u0442\u0435\u0440\u044f\u044e\u0442 \u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/(?&lt;\u0441\u043b\u043e\u0432\u043e&gt;(?&lt;\u0431\u0443\u043a\u0432\u0438\u0446\u0430&gt;\\p{Script=Cyrillic})\\p{Script=Cyrillic}+)\/gimsu<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0441\u0438\u0441\u0442\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u043e \u0438 \u0434\u0435\u043b\u043e \u0432\u044b\u0432\u0435\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043d\u0438\u044f \u0432 \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0443. \u0427\u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u044f\u0442 5 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\\t\/ \/\\ci\/ \/\\x09\/ \/\\u0009\/ \/\\u{9}\/u<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 JS \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a, \u043d\u043e \u043a\u0430\u043a \u0431\u044b\u0442\u044c \u0441 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c\u0438?<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const text = 'lol;)'  \/\/ SyntaxError: Invalid regular expression: \/^(lol;)){2}$\/: Unmatched ')' const regexp = new RegExp( `^(${ text }){2}$` )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0443, \u0438\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a, \u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u043e\u0434\u043d\u0443 \u0441\u043b\u043e\u0436\u043d\u0443\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const VISA = \/(?&lt;type&gt;4)\\d{12}(?:\\d{3})?\/ const MasterCard = \/(?&lt;type&gt;5)[12345]\\d{14}\/  \/\/ Invalid regular expression: \/(?&lt;type&gt;4)\\d{12}(?:\\d{3})?|(?&lt;type&gt;5)[12345]\\d{14}\/: Duplicate capture group name const CardNumber = new RegExp( VISA.source + '|' + MasterCard.source )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u0440\u043e\u0447\u0435, \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u043e, \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0430 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0430\u0434\u0441\u043a\u0438! \u041a\u0430\u043a\u0438\u0435 \u0435\u0441\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b?<\/p>\n<p>  <\/p>\n<h1 id=\"svoi-regulyarki-s-rasputnym-sintaksisom\">\u0421\u0432\u043e\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u0441 \u0440\u0430\u0441\u043f\u0443\u0442\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c<\/h1>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0432\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a \u043d\u0430 JS. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c <a href=\"https:\/\/xregexp.com\/\" rel=\"nofollow noopener noreferrer\">XRegExp<\/a>:<\/p>\n<p>  <\/p>\n<ul>\n<li>API \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/li>\n<li>\u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430\u043c\u0438.<\/li>\n<li>\u041d\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438.<\/li>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 IDE.<\/li>\n<li><a href=\"https:\/\/bundlephobia.com\/package\/xregexp\" rel=\"nofollow noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/badgen.net\/bundlephobia\/minzip\/xregexp\"><\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0432\u0441\u0451 \u0442\u0435 \u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0447\u0442\u043e \u0438 \u0443 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a, \u043d\u043e \u0432\u0442\u0440\u0438\u0434\u043e\u0440\u043e\u0433\u0430.<\/p>\n<p>  <\/p>\n<h1 id=\"generatory-parserov\">\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432<\/h1>\n<p>  <\/p>\n<p>\u0412\u044b \u0441\u043a\u0430\u0440\u043c\u043b\u0438\u0432\u0430\u0435\u0442\u0435 \u0438\u043c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c DSL, \u0430 \u043e\u043d\u0438 \u0432\u044b\u0434\u0430\u044e\u0442 \u0432\u0430\u043c JS \u043a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c <a href=\"https:\/\/pegjs.org\/\" rel=\"nofollow noopener noreferrer\">PEG.js<\/a>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441.<\/li>\n<li>\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u2014 \u0432\u0435\u0449\u044c \u0432 \u0441\u0435\u0431\u0435 \u0438 \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u0442\u0441\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438.<\/li>\n<li>\u041d\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/li>\n<li>\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 IDE.<\/li>\n<li>\u041c\u0438\u043d\u0438\u043c\u0443\u043c 2 \u043a\u0431 \u0432 \u0443\u0436\u0430\u0442\u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0442\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443.<\/li>\n<\/ul>\n<p>  <\/p>\n<p><a href=\"https:\/\/pegjs.org\/online\" rel=\"nofollow noopener noreferrer\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435.<\/a><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435, \u043d\u043e \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043a\u043e\u0441\u044f\u043a\u0430\u043c\u0438. \u0418 \u043f\u043e \u0432\u043e\u0440\u043e\u0431\u044c\u044f\u043c \u0438\u0437 \u044d\u0442\u043e\u0439 \u043f\u0443\u0448\u043a\u0438 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0448\u044c.<\/p>\n<p>  <\/p>\n<h1 id=\"bildery-nativnyh-regulyarok\">\u0411\u0438\u043b\u0434\u0435\u0440\u044b \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a<\/h1>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c TypeScript \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/hyoo-ru\/mam_mol\/tree\/master\/regexp\" rel=\"nofollow noopener noreferrer\">$mol_regexp<\/a>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0442\u0440\u043e\u0433\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f.<\/li>\n<li>\u0425\u043e\u0440\u043e\u0448\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 IDE.<\/li>\n<li>\u041a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a \u0441 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u0437\u0430\u0445\u0432\u0430\u0442\u0430.<\/li>\n<li>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0430\u0442\u0447\u0438\u0442\u0441\u044f \u043d\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443.<\/li>\n<li><a href=\"https:\/\/bundlephobia.com\/package\/mol_regexp\" rel=\"nofollow noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/badgen.net\/bundlephobia\/minzip\/mol_regexp\"><\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435..<\/p>\n<p>  <\/p>\n<h2 id=\"nomera-bankovskih-kart\">\u041d\u043e\u043c\u0435\u0440\u0430 \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u043a\u0430\u0440\u0442<\/h2>\n<p>  <\/p>\n<h3 id=\"importiruem-komponenty-bildera\">\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0431\u0438\u043b\u0434\u0435\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043b\u0438\u0431\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438-\u0444\u0430\u0431\u0440\u0438\u043a\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043e\u043a, \u043b\u0438\u0431\u043e \u0441\u0430\u043c\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const {     char_only, latin_only, decimal_only,     begin, tab, line_end, end,     repeat, repeat_greedy, from, } = $mol_regexp<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"nu-ili-tak-esli-vy-eschyohttpshabhubhyooruauthornin-jinrepohabhubarticle18-ispolzuete-npm\">\u041d\u0443 \u0438\u043b\u0438 \u0442\u0430\u043a, \u0435\u0441\u043b\u0438 <a href=\"https:\/\/habhub.hyoo.ru\/#!author=nin-jin\/repo=HabHub\/article=18\" rel=\"nofollow noopener noreferrer\">\u0432\u044b \u0435\u0449\u0451<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 NPM<\/h3>\n<p>  <\/p>\n<pre><code class=\"javascript\">import { $mol_regexp: {     char_only, decimal_only,     begin, tab, line_end,     repeat, from, } } from 'mol_regexp'<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"pishem-regulyarki-dlya-raznyh-tipov-kart\">\u041f\u0438\u0448\u0435\u043c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043a\u0430\u0440\u0442<\/h3>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \/4(?:\\d){12,}?(?:(?:\\d){3,}?){0,1}\/gsu const VISA = from([     '4',     repeat( decimal_only, 12 ),     [ repeat( decimal_only, 3 ) ], ])  \/\/ \/5[12345](?:\\d){14,}?\/gsu const MasterCard = from([     '5',     char_only( '12345' ),     repeat( decimal_only, 14 ), ])<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0444\u0430\u0431\u0440\u0438\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0442\u0440\u043e\u043a\u0443 \u0438 \u0442\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/li>\n<li>\u0427\u0438\u0441\u043b\u043e \u0438 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043a\u0430\u043a \u044e\u043d\u0438\u043a\u043e\u0434 \u043a\u043e\u0434\u0435\u043f\u043e\u0438\u043d\u0442.<\/li>\n<li>\u0414\u0440\u0443\u0433\u0443\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043a\u0430\u043a \u0435\u0441\u0442\u044c.<\/li>\n<li>\u041c\u0430\u0441\u0441\u0438\u0432 \u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u043a\u0442\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0412\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/li>\n<li>\u041e\u0431\u044a\u0435\u043a\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430\u0445\u0432\u0430\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440).<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"komponuem-v-odnu-regulyarku\">\u041a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c \u0432 \u043e\u0434\u043d\u0443 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443<\/h3>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \/(?:(4(?:\\d){12,}?(?:(?:\\d){3,}?){0,1})|(5[12345](?:\\d){14,}?))\/gsu const CardNumber = from({ VISA, MasterCard })<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"stroka-spiska-kart\">\u0421\u0442\u0440\u043e\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u0430\u0440\u0442<\/h3>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \/^(?:\\t){0,}?(?:((?:(4(?:\\d){12,}?(?:(?:\\d){3,}?){0,1})|(5[12345](?:\\d){14,}?))))(?:((?:\\r){0,1}\\n)|(\\r))\/gmsu const CardRow = from(     [ begin, repeat( tab ), {CardNumber}, line_end ],     { multiline: true }, )<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"sam-spisok-kartochek\">\u0421\u0430\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0440\u0442\u043e\u0447\u0435\u043a<\/h3>\n<p>  <\/p>\n<pre><code class=\"javascript\">const cards = `     3123456789012     4123456789012     551234567890123     5512345678901234 `<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"parsim-tekst-regulyarkoy\">\u041f\u0430\u0440\u0441\u0438\u043c \u0442\u0435\u043a\u0441\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439<\/h3>\n<p>  <\/p>\n<pre><code class=\"javascript\">for( const token of cards.matchAll( CardRow ) ) {      if( !token.groups ) {         if( !token[0].trim() ) continue         console.log( '\u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u043e\u043c\u0435\u0440\u0430', token[0].trim() )         continue     }      const type = ''         || token.groups.VISA &amp;&amp; '\u041a\u0430\u0440\u0442\u0430 VISA'         || token.groups.MasterCard &amp;&amp; 'MasterCard'      console.log( type, token.groups.CardNumber )  }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0443\u0442, \u043f\u0440\u0430\u0432\u0434\u0430, \u0435\u0441\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f. <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/String\/matchAll\" rel=\"nofollow noopener noreferrer\"><code>matchAll<\/code><\/a> \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430\u043c\u0438 \u0432\u044b\u0434\u0430\u0451\u0442 \u0442\u043e\u043a\u0435\u043d \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0438\u0445 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. <code>$mol_regexp<\/code> \u0436\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0432\u043f\u0430\u0432\u0448\u0438\u043c\u0438 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0432\u044b\u0434\u0430\u0451\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d. \u041e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044e \u043f\u043e\u043b\u044f <code>groups<\/code>. \u042d\u0442\u0430 \u0432\u043e\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9B%D0%B5%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7\" rel=\"nofollow noopener noreferrer\">\u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b<\/a>, \u043a\u0430\u043a \u0432\u043e \u0432\u0437\u0440\u043e\u0441\u043b\u044b\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u0430\u0445.<\/p>\n<p>  <\/p>\n<h3 id=\"rezultat-parsinga\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430<\/h3>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 3123456789012 \u041a\u0430\u0440\u0442\u0430 VISA 4123456789012 \u041e\u0448\u0438\u0431\u043a\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 551234567890123 MasterCard 5512345678901234<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/codepen.io\/nin-jin\/pen\/YzZvERo?editors=0012\" rel=\"nofollow noopener noreferrer\">\u0417\u0430\u0446\u0435\u043d\u0438\u0442\u044c \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435.<\/a><\/p>\n<p>  <\/p>\n<h2 id=\"e-mail\">E-Mail<\/h2>\n<p>  <\/p>\n<p>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const {     begin, end,     char_only, char_range,     latin_only, slash_back,     repeat_greedy, from, } = $mol_regexp  \/\/ \u041b\u043e\u0433\u0438\u043d \u0432 \u0432\u0438\u0434\u0435 \u043f\u0443\u0442\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c \u0442\u043e\u0447\u043a\u0430\u043c\u0438 const atom_char = char_only( latin_only, &quot;!#$%&amp;'*+\/=?^`{|}~-&quot; ) const atom = repeat_greedy( atom_char, 1 ) const dot_atom = from([ atom, repeat_greedy([ '.', atom ]) ])  \/\/ \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0437\u0430\u043a\u0430\u0432\u044b\u0447\u0435\u043d\u043d\u043e\u043c \u0438\u043c\u0435\u043d\u0438 \u0441\u0435\u043d\u0434\u0431\u043e\u043a\u0441\u0430 const name_letter = char_only(     char_range( 0x01, 0x08 ),     0x0b, 0x0c,     char_range( 0x0e, 0x1f ),     0x21,     char_range( 0x23, 0x5b ),     char_range( 0x5d, 0x7f ), )  \/\/ \u042d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0438\u043c\u0435\u043d\u0438 \u0441\u0435\u043d\u0434\u0431\u043e\u043a\u0441\u0430 const quoted_pair = from([     slash_back,     char_only(         char_range( 0x01, 0x09 ),         0x0b, 0x0c,         char_range( 0x0e, 0x7f ),     ) ])  \/\/ \u0417\u0430\u043a\u0430\u0432\u044b\u0447\u0435\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u0435\u043d\u0434\u0431\u043e\u0440\u043a\u0441\u0430 const name = repeat_greedy({ name_letter, quoted_pair }) const quoted_name = from([ '&quot;', {name}, '&quot;' ])  \/\/ \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0438\u043c\u0435\u0439\u043b\u0430: \u0434\u043e\u043c\u0435\u043d\u043d\u0430\u044f \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f const local_part = from({ dot_atom, quoted_name }) const domain = dot_atom  \/\/ \u041c\u0430\u0442\u0447\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u0439\u043b\u043e\u043c const mail = from([ begin, local_part, '@', {domain}, end ])<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0438\u043c\u0435\u0439\u043b \u2014 \u044d\u043a\u0430 \u043d\u0435\u0432\u0438\u0434\u0430\u043b\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u043c\u0435\u0439\u043b!<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/  SyntaxError: Wrong param: dot_atom=foo..bar mail.generate({     dot_atom: 'foo..bar',     domain: 'example.org', })<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423\u043f\u0441, \u0435\u0440\u0443\u043d\u0434\u0443 \u0441\u043c\u043e\u0440\u043e\u0437\u0438\u043b\u2026 \u041f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ foo.bar@example.org mail.generate({     dot_atom: 'foo.bar',     domain: 'example.org', })<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ &quot;foo..bar&quot;@example.org mail.generate({     name: 'foo..bar',     domain: 'example.org', })<\/code><\/pre>\n<p>  <\/p>\n<p><a href=\"https:\/\/codepen.io\/nin-jin\/pen\/MWpBYqz?editors=0012\" rel=\"nofollow noopener noreferrer\">\u041f\u043e\u0433\u043e\u043d\u044f\u0442\u044c \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435.<\/a><\/p>\n<p>  <\/p>\n<h2 id=\"routy\">\u0420\u043e\u0443\u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0441\u0435\u043e\u0448\u043d\u0438\u043a \u043f\u043e\u0439\u043c\u0430\u043b \u0432\u0430\u0441 \u0432 \u0442\u0451\u043c\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0443\u043b\u043a\u0435 \u0438 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u043c\u0443 &quot;\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435&quot; \u0443\u0440\u043b\u044b \u0432\u0438\u0434\u0430 <code>\/snjat-dvushku\/s-remontom\/v-vihino<\/code>. \u041d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0440\u0435\u0437\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439, \u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u0435\u043c\u0443 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const translit = char_only( latin_only, '-' ) const place = repeat_greedy( translit )  const action = from({ rent: 'snjat', buy: 'kupit' }) const repaired = from( 's-remontom' )  const rooms = from({     one_room: 'odnushku',     two_room: 'dvushku',     any_room: 'kvartiru', })  const route = from([     begin,     '\/', {action}, '-', {rooms},     [ '\/', {repaired} ],     [ '\/v-', {place} ],     end, ])<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0441\u0443\u043d\u044c\u0442\u0435 \u0432 \u043d\u0435\u0451 \u0443\u0440\u043b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ `\/snjat-dvushku\/v-vihino`.matchAll(route).next().value.groups {     action: &quot;snjat&quot;,     rent: &quot;snjat&quot;,     buy: &quot;&quot;,     rooms: &quot;dvushku&quot;,     one_room: &quot;&quot;,     two_room: &quot;dvushku&quot;,     any_room: &quot;&quot;,     repaired: &quot;&quot;,     place: &quot;vihino&quot;, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0443\u0440\u043b, \u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0439\u0442\u0435 \u0433\u0440\u0443\u043f\u043f\u0430\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ \/kupit-kvartiru\/v-moskve route.generate({     buy: true,     any_room: true,     repaired: false,     place: 'moskve', })<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c <code>true<\/code>, \u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u044f\u0442\u043e \u0438\u0437 \u0441\u0430\u043c\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438. \u0410 \u0435\u0441\u043b\u0438 <code>false<\/code>, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0438\u043f\u043d\u0443\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u0432\u0441\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0418 \u043f\u043e\u043a\u0430 \u0441\u0435\u043e\u0448\u043d\u0438\u043a \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e \u043f\u043e\u0442\u0438\u0440\u0430\u0435\u0442 \u0440\u0443\u043a\u0438 \u043f\u0440\u0435\u0434\u0432\u043a\u0443\u0448\u0430\u044f \u043f\u0435\u0440\u0432\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0432\u044b\u0434\u0430\u0447\u0435, \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u043d\u044c\u0442\u0435 \u0442\u0435\u043b\u0435\u0444\u043e\u043d, \u0432\u044b\u0437\u043e\u0432\u0438\u0442\u0435 \u043f\u043e\u043b\u0438\u0446\u0438\u044e, \u0430 \u0441\u0430\u043c\u0438 <a href=\"https:\/\/codepen.io\/nin-jin\/pen\/QWpBwYx?editors=0012\" rel=\"nofollow noopener noreferrer\">\u0441\u043a\u0440\u043e\u0439\u0442\u0435\u0441\u044c \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0435<\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"kak-eto-rabotaet\">\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b, \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438 \u0440\u0430\u043d\u0435\u0435, \u043d\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0443\u044e\u0442\u0441\u044f. \u041f\u043e\u043f\u0430\u0434\u0451\u0442\u0441\u044f \u0432\u0430\u043c 2 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u0433\u0440\u0443\u043f\u043f \u0438 \u0432\u0441\u0451, \u043f\u043e\u0435\u0445\u0430\u043b\u0438 \u0437\u0430 \u043a\u043e\u0441\u0442\u044b\u043b\u044f\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b. \u041d\u043e \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u043f\u0440\u043e\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 <code>groups<\/code> \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0438\u043c\u0451\u043d:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ time.source == &quot;((\\d{2}):(\\d{2}))&quot; \/\/ time.groups == [ 'time', 'hours', 'minutes' ] const time = from({     time: [         { hours: repeat( decimal_only, 2 ) },         ':',         { minutes: repeat( decimal_only, 2 ) },     ], )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043c <code>exec<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u0441\u0442-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 \u043d\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>groups<\/code> \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">{     time: '12:34',     hours: '12,     minutes: '34', }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0441\u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b, \u043d\u043e \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u0438\u043c\u0451\u043d \u0433\u0440\u0443\u043f\u043f, \u0442\u043e \u0432\u0441\u0451 \u043f\u043e\u0435\u0434\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/\/ time.source == &quot;((\\d{2}):(\\d{2}))&quot; \/\/ time.groups == [ 'time', 'minutes' ] const time = wrong_from({     time: [         \/(\\d{2})\/,         ':',         { minutes: repeat( decimal_only, 2 ) },     ], )<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"javascript\">{     time: '12:34',     hours: '34,     minutes: undefined, }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e, \u043f\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u043e\u0439, \u043d\u0443\u0436\u043d\u043e &quot;\u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c&quot; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432 \u043d\u0435\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043e \u0433\u0440\u0443\u043f\u043f \u0438 \u0434\u0430\u0442\u044c \u0438\u043c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 &quot;0&quot;, &quot;1&quot; \u0438 \u0442\u0434. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u043b\u0430 \u0441 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439, \u0438 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0438\u0441\u043b\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">new RegExp( '|' + regexp.source ).exec('').length - 1<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e <code>String..match<\/code> \u0438 <code>String..matchAll<\/code> \u043a\u043b\u0430\u043b\u0438 \u0448\u0443\u0440\u0443\u043f \u043d\u0430 \u043d\u0430\u0448 \u0447\u0443\u0434\u0435\u0441\u043d\u044b\u0439 <code>exec<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0443\u043c\u0443 \u0440\u0430\u0437\u0443\u043c\u0443, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0434\u043b\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u044b <code>Symbol.match<\/code> \u0438 <code>Symbol.matchAll<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">*[Symbol.matchAll] (str:string) {     const index = this.lastIndex     this.lastIndex = 0     while ( this.lastIndex &lt; str.length ) {         const found = this.exec(str)         if( !found ) break         yield found     }     this.lastIndex = index }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0432\u0441\u0451 \u0431\u044b \u0445\u043e\u0440\u043e\u0448\u043e, \u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0439\u043f\u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0435 \u043f\u043e\u0439\u043c\u0451\u0442, \u043a\u0430\u043a\u0438\u0435 \u0432 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0435 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface RegExpMatchArray {     groups?: {         [key: string]: string     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0436, \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0435\u0437\u044c\u044f\u043d\u043a\u0438 \u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u043d\u0435\u0434\u043e\u0440\u0430\u0437\u0443\u043c\u0435\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">interface String {      match&lt; RE extends RegExp &gt;( regexp: RE ): ReturnType&lt;         RE[ typeof Symbol.match ]     &gt;      matchAll&lt; RE extends RegExp &gt;( regexp: RE ): ReturnType&lt;         RE[ typeof Symbol.matchAll ]     &gt;  }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c TypeScript \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0434\u043b\u044f <code>groups<\/code> \u0438\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438, \u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u0432\u043e\u0438 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0435.<\/p>\n<p>  <\/p>\n<p>\u0415\u0449\u0451 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u0433\u0440\u0443\u043f\u043f, \u043d\u043e <a href=\"https:\/\/github.com\/nin-jin\/tdtd\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"naputstvie\">\u041d\u0430\u043f\u0443\u0442\u0441\u0442\u0432\u0438\u0435<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 <a href=\"https:\/\/github.com\/hyoo-ru\/mam_mol\/tree\/master\/regexp\" rel=\"nofollow noopener noreferrer\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e $mol_regexp<\/a>.<\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u0434\u0438\u043a\u043e\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u044b \u2014 \u0442\u043e\u043a\u0435\u043d\u0430\u0439\u0437\u0435\u0440\u044b <a href=\"https:\/\/habhub.hyoo.ru\/#!author=nin-jin\/repo=HabHub\/article=39\" rel=\"nofollow noopener noreferrer\">MarkedText<\/a>: <a href=\"https:\/\/github.com\/hyoo-ru\/marked.hyoo.ru\" rel=\"nofollow noopener noreferrer\">$hyoo_marked<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/hyoo-ru\/mam_mol#usage-from-npm-ecosystem\" rel=\"nofollow noopener noreferrer\">\u0414\u0440\u0443\u0433\u0438\u0435 \u043c\u0438\u043a\u0440\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b MAM<\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0432 NPM.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0430\u043b\u043b\u0435\u0440\u0433\u0438\u044f \u043d\u0430 $mol, \u0442\u043e <a href=\"https:\/\/tomassetti.me\/parsing-in-javascript\/\" rel=\"nofollow noopener noreferrer\">\u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u043e \u0447\u0442\u043e \u0431\u044b \u0432\u044b \u043d\u0438 \u0432\u044b\u0431\u0440\u0430\u043b\u0438 \u2014 \u0437\u043d\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0433\u0434\u0435-\u0442\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u043f\u043b\u0430\u0447\u0435\u0442 (\u043e\u0442 \u0441\u0447\u0430\u0441\u0442\u044c\u044f) \u043e\u0434\u0438\u043d \u0432\u0435\u0440\u0431\u043b\u044e\u0434.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cu\/hi\/bi\/cuhibidierzgneecfioabmqlc8m.jpeg\"><\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/561704\/\"> https:\/\/habr.com\/ru\/post\/561704\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435, \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u041a\u0430\u0440\u043b\u043e\u0432\u0441\u043a\u0438\u0439 \u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u044f \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/perldoc.perl.org\/perlre\" rel=\"nofollow noopener noreferrer\">Perl<\/a> \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430. \u0422\u043e\u043b\u044c\u043a\u043e \u0433\u043b\u044f\u043d\u044c\u0442\u0435, \u043a\u0430\u043a\u0438\u043c \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043c\u0435\u0439\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">\/^(?:((?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}(?:\\.(?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}){0,})|(&quot;(?:((?:(?:([\\u{1}-\\u{8}\\u{b}\\u{c}\\u{e}-\\u{1f}\\u{21}\\u{23}-\\u{5b}\\u{5d}-\\u{7f}])|(\\\\[\\u{1}-\\u{9}\\u{b}\\u{c}\\u{e}-\\u{7f}]))){0,}))&quot;))@(?:((?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}(?:\\.(?:[\\w!#\\$%&amp;'\\*\\+\\\/=\\?\\^`\\{\\|\\}~-]){1,}){0,}))$\/gsu<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0443\u0442, \u043f\u0440\u0430\u0432\u0434\u0430, \u0437\u0430\u043a\u0440\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u043e\u043a. \u041d\u0443 \u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-324571","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324571","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=324571"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/324571\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=324571"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=324571"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=324571"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}