Тұрақты өрнектер жолды қоспай іздейді. Javascript, тұрақты өрнек: мысалдар, тұрақты өрнектерді тексеру. Топтар мен ауқымдар

жаңа RegExp(үлгі[, жалаушалар])

ADVANCE тұрақты өрнек

Бұл белгілі әріптік синтаксиске артықшылық беріледі(/test/i).

Егер тұрақты өрнек алдын ала белгілі болмаса, конструкторды (жаңа RegExp) пайдаланып тұрақты өрнекті (таңбалар жолында) жасаған дұрыс.

Бірақ назар аударыңыз, «қиғаш сызық» \ кодты ауыстыру рөлін атқаратындықтан, оны литерал жолында екі рет жазу керек (жаңа RegExp): \\

Жалаулар

Мен сәйкестендіру кезінде регистрді елемеймін

g жаһандық сәйкестік, жергілікті сәйкестіктен айырмашылығы (әдепкі бойынша, үлгінің бірінші данасына ғана сәйкес келеді), үлгінің барлық даналарының сәйкестігіне мүмкіндік береді

Операторлар

Не Қалай Сипаттама Қолданылуы
мен жалау рег. регистрді сезбейтін өрнек /testik/i
g жалау жаһандық іздеу /testik/g
м жалау мәтіндік аумақтан алуға болатын көптеген жолдармен сәйкестендіруге мүмкіндік береді
символдар класының операторы таңбалар жиынын сәйкестендіру - а-дан z-ге дейінгі аралықтағы кез келген таңба;
^ карет операторы қоспағанда [^a-z] - а-дан z-ге дейінгі аралықтағы таңбалардан ҚОСЫМША кез келген таңба;
- дефис операторы қоса алғанда мәндер ауқымын көрсетіңіз - а-дан z-ге дейінгі аралықтағы кез келген таңба;
\ қашу операторы кез келген келесі таңбадан қашады \\
^ сәйкес операторды бастаңыз үлгі сәйкестігі басында болуы керек /^testik/g
$ сәйкестік соңындағы оператор үлгі сәйкестігі соңында болуы керек /testik$/g
? оператор? кейіпкерді таңдаулы етеді /t?est/g
+ оператор + /t+est/g
+ оператор + таңба бір немесе бірнеше рет болуы керек /t+est/g
* оператор * таңба бір рет немесе бірнеше рет болуы немесе мүлдем болмауы керек /t+est/g
{} оператор() таңбаларды қайталаудың белгіленген санын орнатыңыз /t(4)est/g
{,} оператор (,) белгілі бір шектерде таңбаның қайталану санын орнату /t(4,9)est/g

Алдын ала анықталған таңбалар кластары

Алдын ала анықталған мүше Салыстыру
\t көлденең қойынды
\n Сызық арнасы
. Жол арнасынан басқа кез келген таңба
\d Кез келген оныншы цифр, ол эквивалент
\D [^0-9] тең оныншы саннан басқа кез келген таңба
\w Баламалы кез келген таңба (сандар, әріптер және астын сызу).
[^A-Za-z0-9] балама сандар, әріптер және астын сызулардан басқа кез келген таңба
\s Кез келген бос орын белгісі
Кеңістіктен басқа кез келген таңба
\b Сөз шекарасы
\B Сөздің шекарасы ЕМЕС, ішкі. Бөлім

Топтау()

Мүшелер тобына + (/(abcd)+/) сияқты операторды қолданғыңыз келсе, жақшаларды () пайдалануға болады.

Бекітулер

Тұрақты өрнектің жақшаға () алынған бөлігі аталады бекіту.

Келесі мысалды қарастырыңыз:

/^()k\1/

\1 a , b , c таңбаларының кез келген символы емес .
\1 - басталатын кез келген таңба бірінші таңбамен сәйкестендіріңіз. Яғни, тұрақты өрнек шешілмейінше \1 сәйкес таңба белгісіз.

Бекітілмеген топтар

Жақшалар () 2 жағдайда қолданылады: топтау үшін және бекітуді белгілеу үшін. Бірақ () тек топтастыру үшін пайдалану қажет болатын жағдайлар бар, өйткені міндеттеме талап етілмейді, сонымен қатар қажетсіз міндеттемелерді жою арқылы біз қалыпты өрнектерді өңдеу механизмін жеңілдетеміз.

Сонымен бекітуге жол бермейдіАшылатын жақшаның алдында мынаны қою керек: ?:

str = "

Сәлем әлем!
"; табылды = str.match(/<(?:\/?)(?:\w+)(?:[^>]*?)>/i); console.log("түзетусіз табылды: ", табылды); // [ "
" ]

сынақ функциясы

Regexp.test()

Сынақ функциясы тұрақты өрнек жолға (str) сәйкес келетінін тексереді. ақиқат немесе жалған мәнін қайтарады.

Қолдану мысалы:

Javascript

function codeF(str)( return /^\d(5)-\d(2)/.test(str); ) //console.log(codeF("12345-12ss")); // true //console.log(codeF("1245-12ss")); // жалған

сәйкестік функциясы

str.match(regexp)

Сәйкестік функциясы мәндер жиымын қайтарады немесе сәйкестік табылмаса нөл. Тексеру: егер тұрақты өрнекте g жалаушасы болмаса (жаһандық іздеуді орындау үшін), онда сәйкестік әдісі жолдағы бірінші сәйкестікті және мысалдан көрініп тұрғандай сәйкестіктер массивінде қайтарады. ТЕКСЕРУЛЕР құлады(жақшаға алынған тұрақты өрнек бөлігі).

Javascript

str = "Ақпарат алу үшін мынаны қараңыз: 3.4.5.1 тарау"; re = /тарау (\d+(\.\d)*)/i // тапсырмалары бар (жаһандық жалаусыз) табылды = str.match(re) console.log(табылды); // ["3.4.5.1-тарау", "3.4.5.1", ".1"]

Match() әдісін жаһандық тұрақты өрнекпен (g жалаушасымен) қамтамасыз етсеңіз, массив де қайтарылады, бірақ GLOBAL сәйкестіктерімен. Яғни, жазылған нәтижелер қайтарылмайды.

Javascript

str = "Ақпарат алу үшін мынаны қараңыз: 3.4.5.1 тарау, 7.5 тарау"; re = /тарау (\d+(\.\d)*)/ig // міндеттемесіз - жаһандық деңгейде табылды = str.match(re) console.log(табылды); // ["3.4.5.1-тарау", "7.5-тарау"]

exec функциясы

regexp.exec(str)

exec функциясы тұрақты өрнектің жолға (str) сәйкес келетінін тексереді. Нәтижелердің массивін (міндеттемелерімен) немесе null қайтарады. Әрбір келесі exec шақыруы (мысалы, while пайдалану кезінде) орын алады (exec соңғы іздеудің соңындағы индексті, lastIndex автоматты түрде жаңарту арқылы) және келесі жаһандық сәйкестікке ауысады (егер g жалаушасы көрсетілсе).

Javascript

var html = "
БАМ! БУМ!
"; var reg = /<(\/?)(\w+)([^>]*?)>/g; //console.log(reg.exec(html)); // ["
", "", "div", " class="test""] while((матч = reg.exec(html)) !== null)( console.log(reg.exec(html)); ) /* [" ", "", "b", ""] [" ", "", "em", ""] ["
", "/", "div", ""] */

Ғаламдық жалаусыз, match және exec әдістері бірдей жұмыс істейді. Яғни, олар бірінші жаһандық сәйкестік пен міндеттемесі бар массивді қайтарады.

Javascript

// сәйкес html var = "
БАМ! БУМ!
"; var reg = /<(\/?)(\w+)([^>]*?)>/; // ғаламдық console.log(html.match(reg)) жоқ; // ["
", "", "div", " class="test""] // exec var html = "
БАМ! БУМ!
"; var reg = /<(\/?)(\w+)([^>]*?)>/; // ғаламдық console.log(reg.exec(html)) жоқ; // ["
", "", "div", " class="test""]

функциясын ауыстырыңыз

str.replace(regexp, newSubStr|функциясы)
  • regexp - reg. өрнек;
  • newSubStr – мәтіндегі табылған өрнек өзгертілетін жол;
  • функция - параметрлердің айнымалы тізімімен табылған әрбір сәйкестік үшін шақырылады (жолдағы жаһандық іздеу үлгі сәйкестігінің барлық даналарын табатынын еске түсіріңіз).

Бұл функцияның қайтару мәні ауыстыру ретінде қызмет етеді.

Функция параметрлері:

  • 1 - Сәйкес келетін ішкі жолды аяқтаңыз.
  • 2 - жақша топтарының мағынасы (бекітулер).
  • 3 - бастапқы жолдағы сәйкестік индексі (позициясы).
  • 4 - Бастапқы жол.

Әдіс шақыру жолын өзгертпейді, бірақ сәйкестіктерді ауыстырғаннан кейін жаңасын қайтарады. Ғаламдық іздеуді орындау және ауыстыру үшін g жалаушасымен regexp пайдаланыңыз.

"GHGHGHGTTTT".replace(//g,"K"); //"КККККККККК"

Javascript

function upLetter(allStr,letter) ( letter.toUpperCase(); ) var res = "border-top-width".replace(/-(\w)/g, upLetter); console.log(res); //borderTopWidth

Жаңадан бастаушыларға арналған тұрақты өрнектер

Тұрақты тіркестер дегеніміз не?

Егер сіз пәрмен жолымен жұмыс істеген болсаңыз, файл атауы маскаларын пайдаланған боларсыз. Мысалы, ағымдағы каталогтағы «d» әрпінен басталатын барлық файлдарды жою үшін rm d* жазуға болады.

Тұрақты өрнектер жолдарды табуға, оларды үлгі бойынша сынауға және басқа ұқсас жұмыстарға ұқсас, бірақ әлдеқайда күшті құрал. Бұл құралдың ағылшынша атауы Тұрақты өрнектернемесе жай ғана RegExp. Қатаң айтқанда, тұрақты тіркестер жолдық үлгілерді сипаттайтын арнайы тіл болып табылады.

Бұл құралды жүзеге асыру әртүрлі бағдарламалау тілдерінде әртүрлі, бірақ көп болмаса да. Бұл мақалада біз ең алдымен Perl үйлесімді тұрақты өрнектерді іске асыруға назар аударамыз.

Синтаксис негіздері

Ең алдымен, кез келген жолдың өзі тұрақты өрнек екенін атап өткен жөн. Сонымен, Haha өрнегі, анық, «Хаха» жолына сәйкес келеді және бұл ғана. Тұрақты өрнектер регистрді ескереді, сондықтан «haha» жолы (кіші регистр) жоғарыдағы өрнекке сәйкес келмейді.

Дегенмен, бұл жерде абай болу керек - кез келген тіл сияқты, тұрақты сөз тіркестерінің арнайы таңбалары бар, олардан құтылу керек. Міне, олардың тізімі: . ^ $ * + ? ( ) \ | (). Қашу әдеттегі тәсілмен орындалады - арнайы таңба алдында \ қосу.

Таңбалар жинағы

Мәтіндегі күлкіні білдіретін барлық шылауларды тапқымыз келеді делік. Хаха бізге сәйкес келмейді - ақыр соңында, «Хехе», «Хохо» және «Хихи» оның астына түспейді. Ал бірінші әріптің ісіне қатысты мәселені әйтеуір шешу керек.

Мұнда жиындар бізге көмекке келеді – белгілі бір таңбаны көрсетудің орнына біз бүкіл тізімді жаза аламыз, ал егер аталған таңбалардың кез келгені зерттелетін жолда көрсетілген жерде пайда болса, жол қолайлы болып саналады. Үлгілер төртбұрышты жақшада жазылған - үлгі «a», «b», «c» немесе «d» таңбаларының кез келгеніне сәйкес келеді.

Ішкі жиынтық b ОАрнайы таңбалардың көпшілігін босатудың қажеті жоқ, бірақ олардың алдында \ пайдалану қате болып саналмайды. Әлі де «\» және «^» таңбаларынан және жақсырақ «]» таңбаларынан қашу қажет (сондықтан ол «]» немесе «[» таңбаларының кез келгенін білдіреді, ал [x] тек «[» тізбегі болып табылады. x]”). «]» таңбасы бар тұрақты тіркестердің әдеттен тыс болып көрінетін әрекеті шын мәнінде белгілі ережелермен анықталады, бірақ оларды есте сақтаудан гөрі бұл таңбадан құтылу әлдеқайда оңай. Сонымен қатар, «-» белгісін алып тастау керек, ол диапазондарды орнату үшін қолданылады (төменде қараңыз).

Егер сіз ^ символын [-дан кейін бірден жазсаңыз, жиын қарама-қарсы мағынаға ие болады - көрсетілгеннен басқа кез келген таңба қолайлы болып саналады. Сонымен, [^xyz] өрнегі «x», «y» немесе «z» таңбаларынан басқа кез келген таңбаға сәйкес келеді.

Сонымен, бұл құралды біздің жағдайда қолданатын болсақ, егер [Xx][aoie]x[aoie] деп жазсақ, онда «Хаха», «хехе», «хихи» және тіпті «Хохо» жолдарының әрқайсысы үлгіге сәйкес келеді.

Алдын ала анықталған таңбалар кластары

Жиі қолданылатын кейбір жинақтар үшін арнайы үлгілер бар. Сонымен, кез келген бос орынды сипаттау үшін (бос орын, қойынды, жол үзілімі) \s пайдаланылады, сандар үшін - \d, латын әріптері үшін сандар және астын сызу «_» - \w.

Кез келген таңбаны сипаттау қажет болса, бұл үшін нүкте қолданылады. . Егер көрсетілген сыныптар бас әріппен жазылса (\S , \D , \W) онда олар мағынасын керісінше өзгертеді - бос орынсыз кез келген таңба, сан емес кез келген таңба және басқа кез келген таңба Латын әліпбиі, сәйкесінше сандар немесе астын сызу.

Сондай-ақ, тұрақты тіркестерді пайдалана отырып, мәтіннің қалған бөлігіне қатысты жолдың орнын тексеруге болады. \b өрнегі сөз шекарасын, \B - сөзсіз шекараны, ^ - мәтіннің басын, $ - соңын білдіреді. Сонымен, \bJava\b үлгісіне сәйкес, алғашқы 4 таңба «Java және JavaScript» жолында, ал \bJava\B үлгісіне сәйкес - 10-нан 13-ке дейінгі таңбалар («сөзінің бөлігі ретінде») JavaScript»).

Ауқымдар

Сізге әріптерден тұратын жиынды белгілеу қажет болуы мүмкін, мысалы, «b» мен «f» дейін. [bvgdezziklmnoprstuf] жазудың орнына диапазон механизмін қолдануға және [b-f] жазуға болады. Осылайша, x үлгісі «xA6» жолына сәйкес келеді, бірақ «xb9» сәйкес келмейді (біріншіден, диапазонда тек бас әріптер көрсетілгендіктен, екіншіден, 9 қосылмағандықтан, 0 -8 аралығында).

Диапазон механизмі әсіресе орыс тіліне қатысты, өйткені ол үшін \w ұқсас конструкция жоқ. Орыс алфавитінің барлық әріптерін белгілеу үшін [а-яА-ЯеО] үлгісін қолдануға болады. «е» әрпі әріптердің жалпы ауқымына кірмейтінін және бөлек көрсетілуі керек екенін ескеріңіз.

Кванторлар (қайталану санын көрсетеді)

Біздің мысалға оралайық. «Күлетін» шылаудың «Хаахаа» сияқты х-тің арасында бірнеше дауысты дыбыс болса ше? Біздің ескі әдеттегі маусым бұдан былай бізге көмектесе алмайды. Мұнда кванторларды қолдануға тура келеді.

Квантор тек өзінен бұрын келетін таңбаға қатысты екенін ескеріңіз.

Кейбір жиі қолданылатын конструкциялар тұрақты өрнек тілінде арнайы белгілерге ие болды:

Сонымен, кванторлардың көмегімен біз [Xx][aoeee]+x[aoeee]* шылауларының үлгісін жақсарта аламыз және ол «Haaha», «heeeeeeh» және «Heehee» жолдарын тани алады.

Жалқау мөлшерлеу

Біз жолдағы барлық HTML тегтерін табу міндетіне тап болдық делік

Тпрогер- менің Қымбаттымбағдарламалау туралы сайт!

Айқын шешім<.*>бұл жерде жұмыс істемейді - ол бүкіл жолды табады, өйткені ол абзац тегінен басталып, аяқталады. Яғни, тегтің мазмұны жол болып саналады

P> Тпрогер- менің Қымбаттымбағдарламалау туралы сайт!

Бұл квантордың әдепкі бойынша деп аталатынға сәйкес жұмыс істеуіне байланысты болады. ашкөзалгоритм - шартқа сәйкес келетін ең ұзын жолды қайтаруға тырысады. Мәселені шешудің екі жолы бар. Біріншісі - өрнекті қолдану<[^>]*> , бұл тік бұрышты жақшаны тегтің мазмұны ретінде қарастырудан сақтайды. Екіншісі – кванторды сараң емес, бірақ жариялау жалқау. Бұл таңба кванторының оң жағына қосу арқылы орындалады ма? . Сол. барлық тегтерді іздеу үшін өрнек бұрылады<.*?> .

Қызғаныш мөлшерлемесі

Кейде іздеу жылдамдығын арттыру үшін (әсіресе жол тұрақты өрнекке сәйкес келмейтін жағдайларда) қалыпты өрнектің қалған бөлігі үшін ықтимал сәйкестіктерді табу үшін алгоритмнің алдыңғы іздеу қадамдарына оралуын болдырмауға болады. деп аталады қызғанышсандық анықтау. Квантор оң жаққа + белгісін қосу арқылы қызғанышпен жасалады. Қызғаныш сандық анықтаудың тағы бір қолданылуы қажетсіз сәйкестіктерді алып тастау болып табылады. Осылайша, «ababa» жолындағы ab*+a үлгісі тек алғашқы үш таңбаға сәйкес келеді, бірақ үшіншіден бесіншіге дейінгі таңбаларға сәйкес келмейді, өйткені Үшінші орында тұрған «a» таңбасы бірінші нәтиже үшін қолданылған.

Жақша топтары

Біздің «күлдіретін» сөз тіркестерінің үлгісі үшін «х» әрпінің бірнеше рет пайда болуы мүмкін екенін ескеру ғана қалды, мысалы, «Хахахахахаааахау» және тіпті «х» әрпімен аяқталуы мүмкін. Бұл жерде [aioe]+x топтық кванторды пайдалану керек болуы мүмкін, бірақ [aoie]x+ деп жазсақ + кванторы бүкіл өрнекке емес, тек “x” таңбасына қолданылады. Бұны түзету үшін өрнек жақшаға алынуы керек: ([aioe]x)+ .

Осылайша, біздің өрнегіміз [Хх]([аое]х?)+ түріне айналады - алдымен бас әріп немесе кіші әріп «x», содан кейін (мүмкін, бірақ міндетті емес) қиылысатын дауысты дыбыстардың ерікті нөлдік емес саны бар. жалғыз кіші «x» әрпімен. Дегенмен, бұл өрнек мәселені тек ішінара шешеді - бұл өрнекте мысалы, «хихахе» сияқты жолдар да болады - біреу осылай күлуі мүмкін, бірақ болжам өте күмәнді. Әлбетте, біз барлық дауысты дыбыстардың жиынтығын бір рет қана пайдалана аламыз, содан кейін біз қандай да бір түрде бірінші іздеудің нәтижесіне сенуіміз керек. Бірақ қалай?...

Топ бойынша іздеу нәтижесін есте сақтау (кері байланыс)

Жақша тобын іздеу нәтижесі жеке жад ұяшығына жазылады, оған тұрақты өрнектің келесі бөліктерінде пайдалану үшін қол жеткізуге болады. Беттегі HTML тегтерін табу тапсырмасына оралсақ, бізге тегтерді тауып қана қоймай, олардың атын да білу қажет болуы мүмкін. Бұл бізге тұрақты өрнек көмектесе алады<(.*?)> .

Тпрогер- менің Қымбаттымбағдарламалау туралы сайт!

Барлық тұрақты өрнектерді іздеу нәтижесі: «

”, “”, “”, “”, “”, “

”.
Бірінші топ бойынша іздеу нәтижесі: “p”, “b”, “/b”, “i”, “/i”, “/i”, “/p”.

Топ бойынша іздеу нәтижесіне \n өрнегі арқылы сілтеме жасауға болады, мұндағы n – 1-ден 9-ға дейінгі сан. Мысалы, (\w)(\w)\1\2 өрнегі “aaaa”, “abab” жолдарына сәйкес келеді. ”, бірақ “aabb” сәйкес келмейді.

Егер өрнек тек кванторды қолдану үшін жақшаға қойылса (бұл топ үшін іздеу нәтижесін есте сақтау жоспарлары жоқ), онда бірден бірінші жақшаны қосу керек?:, мысалы (?:+\w) .

Осы механизмді пайдалана отырып, өрнекті [Xx]([aoie])x?(?:\1x?)* пішініне қайта жаза аламыз.

Тасымалдау

Жолдың үлгілердің ең болмағанда біреуіне сәйкес келетінін тексеру үшін OR логикалық операторының аналогын пайдалануға болады, ол | символы арқылы жазылады. . Осылайша, Anna|Жалғыздық үлгісі сәйкесінше «Анна» және «Жалғыздық» жолдарын қамтиды. Әсіресе жақша топтарының ішіндегі санауларды пайдалану ыңғайлы. Мәселен, мысалы, (?:a|b|c|d) толығымен эквивалентті (бұл жағдайда өнімділігі мен оқылуына байланысты екінші нұсқа қолайлы).

JavaScript тілінде тұрақты өрнектер RegExp нысандарымен ұсынылған. RegExp нысандарын RegExp() конструкторы арқылы жасауға болады, бірақ көбінесе олар арнайы литеральды синтаксис арқылы жасалады. Жол литералдары тырнақшаға алынған таңбалар ретінде көрсетілген сияқты, тұрақты өрнек литералдары қиғаш сызық жұбына алынған таңбалар ретінде көрсетіледі.

/pattern/flags new RegExp("үлгі"[, іздеу опциялары])

үлгі- іздеуге арналған тұрақты өрнек (кейінірек ауыстыру туралы) және жалаушалар - g (жаһандық іздеу), i (регистр маңызды емес) және m (көп жолды іздеу) таңбаларының кез келген комбинациясының жолы. Бірінші әдіс жиі қолданылады, екіншісі - кейде. Мысалы, мұндай екі қоңырау тең.

Іздеу опциялары

Тұрақты өрнекті жасаған кезде біз қосымша іздеу опцияларын көрсете аламыз

JavaScript тұрақты өрнектеріндегі таңбалар

ТаңбаКорреспонденция
Әріптік-сандық таңбаларӨздеріне сәйкес келеді
\0 NUL таңбасы (\u0000)
\tҚойынды (\u0009)
\nЖол фид (\u000A)
\vТік қойынды (\u000B)
\fБет аудармасы (\u000C)
\rКаретканы қайтару (\u000D)
\xnnnn он алтылық санымен көрсетілген латын жиынынан алынған таңба; мысалы, \x0A \n сияқты
\uxxxxxxxx он алтылық санымен көрсетілген Юникод таңбасы; мысалы, \u0009 \t сияқты
\cX«X» басқару таңбасы, мысалы, \cJ тізбегі жаңа жол таңбасына эквивалентті \n
\ Тұрақты кейіпкерлер үшін - оларды ерекше етеді. Мысалы, /s/ өрнегі жай ғана "s" таңбасын іздейді. Егер s алдына \ қойсаңыз, онда /\s/ бос орын таңбасын білдіреді және керісінше, егер таңба ерекше болса, мысалы, \ оны жай «жұлдызша» таңбасына айналдырады. Мысалы, /a*/ 0 немесе одан да көп «a» таңбаларын іздейді. «a*» жұлдызшасы бар а табу үшін - арнайының алдына \ қойыңыз. таңбасы: /a\*/ .
^ Енгізілетін деректердің басын көрсетеді. Егер көп жолды іздеу жалауы («m») орнатылса, ол жаңа жолдың басында да іске қосылады Мысалы, /^A/ «an A» ішінде «A» таба алмайды, бірақ біріншісін табады «Ан А» ішіндегі «А».
$ Енгізілген деректердің соңын көрсетеді. Егер көп жолды іздеу жалаушасы орнатылса, ол жолдың соңында да жұмыс істейді, мысалы, /t$/ «eat» ішінде «t» таба алмайды, бірақ оны «eat» ішінен табады.
* 0 немесе одан да көп қайталауды көрсетеді. Мысалы, /bo*/ «Елес қобалжыды» дегеннен «бooo» және «Құс айқайлады» дегеннен «б» табады, бірақ «Ешкі ыңылдап» ештеңе таба алмайды.
+ 1 немесе одан да көп қайталауды көрсетеді. (1,) тең. Мысалы, /a+/ «кәмпиттердегі» «a» және «caaaaaandy» барлық «а» әрпіне сәйкес келеді.
? Элементтің болуы немесе болмауы мүмкін екенін көрсетеді. Мысалы, /e?le?/ "angel"-дегі "el" мен "бұрыш"-тағы "le"-ге сәйкес келеді, егер * , + , ? , немесе () , содан кейін қайталанулар санын барынша арттыратын әдепкі «ашкөз» режиміне қарағанда (мүмкін болатын ең аз рет, ең жақын келесі үлгі элементіне дейін қайталау) «ашкөз емес» іздеуді көрсетеді. келесі үлгі элементі де сәйкес келеді. (?=) , (?!) және (?:) астындағы кестеде сипатталған алдын ала қарауда пайдаланылады.
. (Ондық нүкте) жаңа жолдан басқа кез келген таңбаны білдіреді: \n \r \u2028 немесе \u2029. (кез келген таңбаны, соның ішінде жаңа жолдарды іздеу үшін [\s\S] пайдалана аласыз). Мысалы, /.n/ «жоқ, алма ағашта» дегендегі «an» және «on» сәйкес келеді, бірақ «nay» емес.
(x)х-ті тауып, есте сақтайды. Бұл «жад жақшалары» деп аталады. Мысалы, /(foo)/ "foo bar" ішіндегі "foo" сөзін тауып, есте сақтайды. Табылған ішкі жол іздеу нәтижесі массивінде немесе RegExp нысанының алдын ала анықталған сипаттарында сақталады: $1, ..., $9 Сонымен қатар, жақшалар оларда бар нәрсені бір үлгі элементіне біріктіреді. Мысалы, (abc)* - abc 0 немесе одан да көп рет қайталаңыз.
(?:x)х-ті табады, бірақ не тапқанын есіне түсірмейді. Бұл «жад жақшалары» деп аталады. Табылған ішкі жол нәтижелер массивінде және RegExp сипаттарында сақталмайды, барлық жақшалар сияқты, олар бір ішкі үлгіге біріктіреді.
x(?=y)Х-тан кейін у болса ғана х-ті табады. Мысалы, /Jack(?=Sprat)/ "Джек" сөзінен кейін "Sprat" болса ғана сәйкес келеді. /Jack(?=Sprat|Frost)/ "Джек" сөзінен кейін "Sprat" немесе "Frost" болса ғана сәйкес келеді. Дегенмен, іздеу нәтижесінде «Шпрат» да, «Аяз» да пайда болмайды.
x(?!y)х-тен кейін у болмаса ғана х-ті табады. Мысалы, /\d+(?!\.)/ саннан кейін ондық бөлшек болмаса ғана сәйкес келеді. /\d+(?!\.)/.exec("3.141") 141-ді табады, бірақ 3.141 емес.
x|yх немесе у санын табады. Мысалы, /жасыл|қызыл/ «жасыл алмадағы» «жасылға» және «қызыл алмадағы» «қызылға» сәйкес келеді.
(n)Мұндағы n – натурал сан. Алдыңғы элементтің дәл n қайталануын табады. Мысалы, /a(2)/ "кәмпиттегі" "а"-ны таппайды, бірақ "каанди"-де а-ны да, "caaandy"-дан алғашқы екі а-ны да табады.
(n,)Мұндағы n – натурал сан. Элементтің n немесе одан көп қайталануын табады. Мысалы, /a(2,) "кәмпитте" "a" ны таппайды, бірақ "caandy" және "caaaaaaandy" ішінен "a" барлығын табады.
(n,m)Мұндағы n және m натурал сандар. Элементтің n-ден m-ге дейін қайталануын табыңыз.
Таңбалар жинағы. Тізімдегі кез келген таңбаны табады. Аралықты сызықша арқылы көрсетуге болады. Мысалы, - сияқты. «Брискет» «b» және «ache» бойынша «a» және «c» сәйкес келеді.
[^xyz]Жинақта көрсетілгендерден басқа кез келген таңба. Сондай-ақ аралықты көрсетуге болады. Мысалы, [^abc] [^a-c] сияқты. «Брискет» сөзінен «r»-ді, «шап» сөзінен «h»-ді табады.
[\b]Кері таңбаны табады. (\b дегенмен шатастырмау керек.)
\bБос орын сияқты (латын) сөз шекарасын табады. ([\b] дегенмен шатастырмау керек). Мысалы, /\bn\w/ "түс күні" "жоқ" сөзіне сәйкес келеді; /\wy\b/ "ly" сөзімен "мүмкін кеше" сәйкес келеді.
\BОл сөз шекарасын көрсетпейді. Мысалы, /\w\Bn/ "түс күні" "қосулы" мәніне сәйкес келеді, ал /y\B\w/ "мүмкін кеше"де "ye" сәйкес келеді.
\cXМұндағы X - А-дан Z-ге дейінгі әріп. Жолдағы басқару таңбасын көрсетеді. Мысалы, /\cM/ Ctrl-M таңбасын білдіреді.
\dкез келген алфавиттен санды табады (біздікі Юникод). Тек тұрақты сандарды табу үшін пайдаланыңыз. Мысалы, /\d/ немесе // "B2 - люкс нөмірі" ішіндегі "2" мәніне сәйкес келеді.
\DСандық емес таңбаны табады (барлық алфавит). [^0-9] тұрақты сандарға баламасы. Мысалы, /\D/ немесе /[^0-9]/ "B2 - люкс нөмірі" ішіндегі "B" әрпіне сәйкес келеді.
\sКез келген бос орын таңбасына, соның ішінде бос орын, қойынды, жаңа жол және басқа Юникод бос орын таңбаларына сәйкес келеді. Мысалы, /\s\w*/ "foo bar" ішіндегі "барға" сәйкес келеді.
Бос орыннан басқа кез келген таңбаны табады. Мысалы, /\S\w*/ "foo bar" ішіндегі "foo" сөзін сәйкестендіреді.
\vТік қойынды таңбасы.
\wӘріптерді, сандарды және астын сызуды қоса алғанда, кез келген сөз (латын әліпбиі) таңбасын табады. Эквивалент. Мысалы, /\w/ "алмадағы" "a", "$5,28" ішіндегі "5" және "3D" ішіндегі "3" мәніне сәйкес келеді.
Кез келген вербалды емес (латын) таңбаны табады. [^A-Za-z0-9_] балама. Мысалы, /\W/ және /[^$A-Za-z0-9_]/ "50%" ішіндегі "%" мәніне бірдей сәйкес келеді.

Javascript тіліндегі тұрақты өрнектермен жұмыс

Javascript-те тұрақты өрнектермен жұмыс String класының әдістерімен жүзеге асырылады

exec(regexp) - жолдағы барлық сәйкестіктерді (қалыпты үлгідегі жазбаларды) табады. Жиымды қайтарады (сәйкестік бар болса) және regexp сипатын жаңартады немесе ештеңе табылмаса нөл. g модификаторымен - бұл функция шақырылған сайын, ол алдыңғы табылғаннан кейін келесі сәйкестікті қайтарады - бұл соңғы іздеудің офсеттік индексін сақтау арқылы жүзеге асырылады.

match(regexp) - үлгіні пайдаланып жолдың бөлігін табу. Егер g модификаторы көрсетілсе, match() барлық сәйкестіктердің массивін немесе нөлді қайтарады (бос массивтің орнына). g модификаторынсыз бұл функция exec();

test(regexp) - функция жолды үлгіге сәйкестігін тексереді. Сәйкестік бар болса ақиқат мәнін, сәйкес келмесе, жалған мәнін қайтарады.

split(regexp) - Бөлгіш ретінде аргументті пайдаланып, шақырылатын жолды ішкі жолдар массивіне бөледі.

replace(regexp, mix) - әдіс үлгіге (тұрақты өрнек) сәйкес өзгертілген жолды қайтарады. regexp бірінші параметрі де тұрақты өрнек емес, жол болуы мүмкін. g модификаторынсыз, жолдағы әдіс тек бірінші орын ауыстырады; g модификаторымен - жаһандық ауыстыру орын алады, яғни. берілген жолдағы барлық оқиғалар өзгереді.

mix - ауыстыру үлгісі, жолдың, ауыстыру үлгісінің, функцияның (функция атауы) мәндерін қабылдай алады.

Ауыстыру жолындағы арнайы таңбалар

Екінші параметр ретінде функцияны көрсетсеңіз, ол әрбір сәйкестікте орындалады. Функция динамикалық түрде ауыстыру жолын жасай алады және қайтара алады. Функцияның бірінші параметрі табылған ішкі жол болып табылады. Ауыстырылатын бірінші аргумент RegExp нысаны болса, келесі n параметрде кірістірілген жақша сәйкестіктері болады. Соңғы екі параметр сәйкестік орын алған жолдағы орын және жолдың өзі.

Кейбір адамдар проблемаға тап болған кезде: «Ой, мен тұрақты тіркестерді қолданамын» деп ойлайды. Енді олардың екі мәселесі бар.
Джейми Завински

Юань-Ма былай деді: «Ағашты ағаштың дәнінен кесу үшін көп күш қажет. Проблемалық құрылым бойынша бағдарламалау үшін көп код қажет.
Мастер Юань-Ма, «Бағдарламалау кітабы»

Бағдарламалау құралдары мен әдістері хаотикалық эволюциялық жолмен аман қалады және таралады. Кейде әдемі және керемет емес, өз саласында жақсы жұмыс істейтін адамдар аман қалады - мысалы, егер олар басқа сәтті технологияға біріктірілсе.

Бұл тарауда біз мұндай құрал – тұрақты тіркестерді қарастырамыз. Бұл жол деректеріндегі үлгілерді сипаттаудың жолы. Олар JavaScript және басқа да көптеген тілдер мен құралдарға кіретін шағын, дербес тілді жасайды.

Тұрақты кестелер өте оғаш және өте пайдалы. Олардың синтаксисі құпия және JavaScript бағдарламалау интерфейсі күрделі. Бірақ бұл жолдарды зерттеуге және өңдеуге арналған қуатты құрал. Оларды түсінгеннен кейін сіз тиімдірек бағдарламашы боласыз.

Тұрақты өрнек құру

Тұрақты – объект түрі. Оны RegExp конструкторын шақыру арқылы немесе қиғаш сызықтармен қоршалған қажетті үлгіні жазу арқылы жасауға болады.

Var re1 = new RegExp("abc"); var re2 = /abc/;

Бұл тұрақты тіркестердің екеуі де бір үлгіні білдіреді: «а» таңбасынан кейін «б» таңбасынан кейін «в» таңбасы.

Егер сіз RegExp конструкторын пайдалансаңыз, онда үлгі кәдімгі жол ретінде жазылады, сондықтан кері қиғаш сызықтарға қатысты барлық ережелер қолданылады.

Үлгі қиғаш сызықтардың арасында орналасқан екінші жазба кері қиғаш сызықтарды басқаша өңдейді. Біріншіден, үлгі алға қиғаш сызықпен аяқталатындықтан, біз үлгіге қосқымыз келетін алға қиғаш сызықтың алдында кері қиғаш сызықты қоюымыз керек. Сонымен қатар, \n сияқты арнайы таңбалардың бөлігі болып табылмайтын кері қиғаш сызықтар сақталады (жолдардағы сияқты еленбейді) және үлгінің мағынасын өзгертеді. Кейбір таңбалар, мысалы, сұрақ белгісі немесе плюс тұрақты тіркестердегі ерекше мағынаға ие және мұндай таңбаны сәйкестендіру қажет болса, оның алдында кері қиғаш сызық болуы керек.

Var eighteenPlus = /он сегіз\+/;

Қандай таңбалардың алдында қиғаш сызық болуы керек екенін білу үшін тұрақты өрнектердегі барлық арнайы таңбалардың тізімін үйрену керек. Бұл әлі мүмкін емес, сондықтан күмәндансаңыз, әріп, сан немесе бос орын емес кез келген таңбаның алдына кері қиғаш сызық қойыңыз.

Сәйкестіктерді тексеру

Әдеттегілердің бірнеше әдістері бар. Ең қарапайымы - сынақ. Егер сіз оған жолды жіберсеңіз, ол жолда берілген үлгінің пайда болуын көрсететін логикалық мәнді қайтарады.

Console.log(/abc/.test("abcde")); // → true console.log(/abc/.test("abxde")); // → жалған

Арнайы емес таңбалардан тұратын тұрақты тізбек бұл таңбалардың жай тізбегі болып табылады. Егер abc біз сынап жатқан жолдың кез келген жерінде болса (тек басында ғана емес), test true мәнін қайтарады.

Кейіпкерлер жинағын іздеуде

Сондай-ақ, indexOf көмегімен жолда abc бар-жоғын білуге ​​болады. Тұрақты үлгілер сізге әрі қарай жүруге және күрделі үлгілерді жасауға мүмкіндік береді.

Кез келген санды табу керек делік. Тұрақты өрнекте шаршы жақшаға таңбалар жиынын қойғанда, бұл өрнектің сол бөлігі жақшадағы кез келген таңбаға сәйкес келетінін білдіреді.

Екі өрнек те саннан тұратын жолдарда.

Console.log(//.test("1992 жылы")); // → true console.log(//.test("1992 жылы")); // → шын

Шаршы жақшада екі таңба арасындағы сызықша таңбалар ауқымын көрсету үшін пайдаланылады, мұнда реттілік Юникод кодтауымен көрсетіледі. 0-ден 9-ға дейінгі таңбалар бір қатарда болады (48-ден 57-ге дейінгі кодтар), сондықтан ол олардың барлығын жазып алады және кез келген санға сәйкес келеді.

Бірнеше таңбалар тобының өздерінің кірістірілген аббревиатуралары бар.

\d Кез келген сан
\w Әріптік-сандық таңба
\s Бос орын таңбасы (бос орын, қойынды, жаңа жол, т.б.)
\D сан емес
\W әріптік-сандық таңба емес
\S бос орын таңбасы емес
. жол арнасынан басқа кез келген таңба

Осылайша, келесі өрнекпен 30.01.2003 15:20 сияқты күн мен уақыт пішімін орнатуға болады:

Var dateTime = /\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 notBinary = /[^01]/; console.log(notBinary.test("1100100010100110")); // → false console.log(notBinary.test("1100100010200110")); // → шын

Үлгінің бөліктерін қайталау

Біз бір санды қалай табуға болатынын білеміз. Бүкіл санды - бір немесе бірнеше цифрлар тізбегін табу керек болса ше?

Егер сіз бір нәрседен кейін қалыпты реттілікте + белгісін қойсаңыз, бұл элементті бірнеше рет қайталауға болатынын білдіреді. /\d+/ бір немесе бірнеше цифрды білдіреді.

Console.log(/"\d+"/.test(""123"")); // → true console.log(/"\d+"/.test("""")); // → false console.log(/"\d*"/.test(""123"")); // → true console.log(/"\d*"/.test("""")); // → шын

Жұлдызша * бірдей мағынаға ие, бірақ ол үлгіні нөл рет қайталауға мүмкіндік береді. Егер бірдеңеден кейін жұлдызша болса, ол ешқашан үлгінің сызықта болуына кедергі жасамайды - ол жерде нөл рет пайда болады.

Сұрақ белгісі үлгінің бір бөлігін міндетті емес етеді, яғни ол нөлге тең немесе бір рет орын алуы мүмкін. Келесі мысалда u таңбасы пайда болуы мүмкін, бірақ үлгі ол болмаса да сәйкес келеді.

Var көрші = /neighbou?r/; console.log(neighbor.test("көрші")); // → true console.log(neighbor.test("neighbor")); // → шын

Бұйра жақшалар үлгінің қанша рет орын алуы керектігін нақты көрсету үшін пайдаланылады. (4) элементтен кейін оның жолда 4 рет пайда болуы керек дегенді білдіреді. Сондай-ақ бос орынды көрсетуге болады: (2,4) элемент кем дегенде 2 және 4 реттен көп болмауы керек дегенді білдіреді.

Күн мен уақыт пішімінің басқа нұсқасы, мұнда бір немесе екі саннан тұратын күндер, айлар және сағаттар рұқсат етіледі. Және бұл аздап оқуға болады.

Var dateTime = /\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 = /boo+(hoo+)+/i; console.log(cartoonCrying.test("Boohoooohoohooo")); // → шын

Бірінші және екінші плюс тек екінші o's in boo and hoo үшін қолданылады. Үшінші + бір немесе бірнеше осындай тізбектерді таба отырып, бүкіл топқа (hoo+) жатады.

Өрнектің соңындағы i әрпі тұрақты өрнекті регистрге сезімтал емес етеді - осылайша B B сәйкес келеді.

Матчтар мен топтар

Тест әдісі тұрақты өрнектерді тексерудің ең қарапайым әдісі болып табылады. Ол тек сәйкестіктің табылған-болмағанын көрсетеді. Регулярларда ешнәрсе табылмаса нөлді қайтаратын exec әдісі бар, ал басқа жағдайда сәйкестік туралы ақпараты бар нысанды қайтарады.

Var match = /\d+/.exec("бір екі 100"); console.log(сәйкестік); // → ["100"] console.log(матч.индекс); // → 8

exec қайтарған нысанда сәйкестік орын алған таңбаның нөмірін қамтитын индекс қасиеті бар. Жалпы, нысан жолдар жиымына ұқсайды, мұнда бірінші элемент сәйкестік үшін тексерілген жол болып табылады. Біздің мысалда бұл біз іздеген сандар тізбегі болады.

Жолдарда бірдей жолмен жұмыс істейтін сәйкестік әдісі бар.

Console.log("бір екі 100".match(/\d+/)); // → ["100"]

Тұрақты өрнек жақша арқылы топтастырылған ішкі өрнектерді қамтыса, осы топтарға сәйкес мәтін де массивте пайда болады. Бірінші элемент әрқашан толық сәйкес келеді. Екіншісі - бірінші топқа сәйкес келетін бөлік (жақшасы бірінші келген), содан кейін екінші топ және т.б.

Var quotedText = /"([^"]*)"/; console.log(quotedText.exec("ол "сәлем"" деді)); // → [""сәлем"", "сәлем"]

Топ мүлде табылмаған кезде (мысалы, одан кейін сұрақ белгісі болса), оның массивтегі орны анықталмаған. Егер топ бірнеше рет сәйкес келсе, массивте тек соңғы сәйкестік болады.

Console.log(/bad(ly)?/.exec("жаман")); // → ["жаман", анықталмаған] console.log(/(\d)+/.exec("123")); // → ["123", "3"]

Топтар жолдардың бөліктерін шығарып алу үшін пайдалы. Егер біз жолда күннің бар-жоғын тексеріп қана қоймай, оны шығарып, күнді білдіретін нысанды жасағымыз келсе, сандар тізбегін жақшаға алып, exec нәтижесінен күнді таңдауға болады.

Біріншіден, біз JavaScript-те күн мен уақытты сақтаудың қолайлы әдісін үйренеміз.

Күн түрі

JavaScript-те күндер үшін стандартты нысан түрі бар, дәлірек айтқанда, уақыт сәттері. Ол Күн деп аталады. Жаңа арқылы жай ғана күн нысанын жасасаңыз, ағымдағы күн мен уақытты аласыз.

Console.log(жаңа күн()); // → Жек 09 қараша 2014 ж. 00:07:57 GMT+0300 (CET)

Сондай-ақ берілген уақытты қамтитын нысанды жасауға болады

Console.log(жаңа күн(2015, 9, 21)); // → 21 қазан 2015 ж. 00:00:00 GMT+0300 (CET) console.log(жаңа Күн(2009, 11, 9, 12, 59, 59, 999)); // → 9 желтоқсан 2009 ж. 12:59:59 GMT+0300 (CET)

JavaScript ай сандары нөлден басталатын және күн сандары бірден басталатын шартты пайдаланады. Бұл ақымақ және күлкілі. Абайлаңыз.

Соңғы төрт аргумент (сағат, минут, секунд және миллисекунд) міндетті емес және жоқ болса, нөлге орнатылады.

Уақыт белгілері 1970 жылдың басынан бері өткен миллисекундтар саны ретінде сақталады. 1970 жылға дейінгі уақыттарда теріс сандар қолданылады (бұл сол уақытта жасалған Unix уақыт конвенциясына байланысты). Күн нысанының getTime әдісі осы санды қайтарады. Ол табиғи түрде үлкен.
console.log(жаңа күн(2013, 11, 19).getTime()); // → 1387407600000 console.log(жаңа Күн(1387407600000)); // → 19 желтоқсан 2013 ж. 00:00:00 GMT+0100 (CET)

Күн конструкторына бір аргумент берсеңіз, ол миллисекундтар саны ретінде қарастырылады. Ағымдағы миллисекунд мәнін Date нысанын жасау және getTime әдісін шақыру немесе Date.now функциясын шақыру арқылы алуға болады.

Date нысанында оның құрамдастарын шығарып алу үшін getFullYear, getMonth, getDate, getHours, getMinutes және getSeconds әдістері бар. Сондай-ақ 93 немесе 14 сияқты өте пайдасыз екі таңбалы кодты қайтаратын getYear әдісі бар.

Үлгінің сәйкес бөліктерін жақшаға алу арқылы біз тікелей жолдан күн нысанын жасай аламыз.

findDate(жол) функциясы ( var dateTime = /(\d(1,2))-(\d(1,2))-(\d(4))/; var match = dateTime.exec(жол); қайтару new Date(Number(сәйкестік), Сан(сәйкес) - 1, Number(сәйкестік) ) console.log(findDate("30-1-2003")); // → 30 қаңтар 2003 ж. 00:00:00 GMT+0100 (CET)

Сөз және жол шекаралары

Өкінішке орай, findDate "100-1-30000" жолынан мағынасыз 00-1-3000 күнін қуана шығарады. Сәйкестік жолдың кез келген жерінде болуы мүмкін, сондықтан бұл жағдайда ол жай ғана екінші таңбадан басталып, екіншіден соңғы таңбаға дейін аяқталады.

Егер сәйкестікті бүкіл жолды қабылдауға мәжбүрлеу қажет болса, біз ^ және $ тегтерін пайдаланамыз. ^ жолдың басына, ал $ соңына сәйкес келеді. Сондықтан /^\d+$/ тек бір немесе бірнеше цифрдан тұратын жолға сәйкес келеді, /^!/ леп белгісінен басталатын жолға сәйкес келеді және /x^/ ешбір жолға сәйкес келмейді (х болуы мүмкін емес).

Егер, керісінше, күн сөз шекарасында басталып, аяқталатынына көз жеткізгіміз келсе, \b белгісін қолданамыз. Сөз шекарасы жолдың басы немесе соңы немесе бір жағында әріптік-сандық таңба \w, екінші жағында әріптік-сандық емес таңба болатын жолдың кез келген жері болуы мүмкін.

Console.log(/cat/.test("біріктіру")); // → true console.log(/\bcat\b/.test("біріктіру")); // → жалған

Шекара белгісі символ емес екенін ескеріңіз. Бұл жай ғана шектеу, яғни сәйкестік белгілі бір шарт орындалса ғана болады.

Таңдауы бар шаблондар

Мәтінде жай сан емес, одан кейін шошқа, сиыр немесе тауық жекеше немесе көпше түрдегі сан бар-жоғын анықтау керек делік.

Үш тұрақты тіркесті жазып, оларды бір-бірлеп тексеруге болар еді, бірақ жақсырақ жолы бар. Таңба | оның сол және оң жағындағы үлгілер арасындағы таңдауды білдіреді. Және мынаны айта аламыз:

Var animalCount = /\b\d+ (шошқа|сиыр|тауық)s?\b/; console.log(animalCount.test("15 шошқа")); // → true console.log(animalCount.test("15 шошқа")); // → жалған

Жақшалар | қолданылатын үлгі бөлігін шектейді және екі опциядан артық таңдауды көрсету үшін мұндай операторлардың көбін бірінен соң бірі орналастыруға болады.

Іздеу жүйесі

Тұрақты өрнектерді блок-схемалар ретінде қарастыруға болады. Төмендегі диаграммада соңғы мал шаруашылығының мысалы сипатталған.

Диаграмманың сол жағынан оңға қарай жолды табу мүмкін болса, өрнек жолға сәйкес келеді. Біз жолдағы ағымдағы орынды есте сақтаймыз және тіктөртбұрыш арқылы өткен сайын, ондағы позициямыздан кейінгі сызықтың бірден бөлігі тіктөртбұрыштың мазмұнына сәйкес келетінін тексереміз.

Бұл блок-схема арқылы өту кезінде біздің тұрақты таңбамыздың «3 шошқа» жолына сәйкес келетінін тексеру келесідей екенін білдіреді:

4-позицияда сөз шекарасы бар және біз бірінші төртбұрышты өткіземіз
- 4-ші позициядан бастап біз санды тауып, екінші төртбұрыш арқылы өтеміз
- 5-позицияда бір жол екінші тіктөртбұрыштың алдынан кері жабылады, ал екіншісі бос орыны бар тіктөртбұрышқа одан әрі барады. Бізде сан емес, бос орын бар және біз екінші жолды таңдаймыз.
- қазір біз 6-шы позицияда, «шошқалардың» басы және жолдардың үш тармақталуындамыз. Сапта «сиыр» немесе «тауық» жоқ, бірақ «шошқа» бар, сондықтан біз осы жолды таңдаймыз.
- үштік шанышқыдан кейінгі 9-позицияда бір жол «s»-ті айналып өтіп, сөз шекарасы бар соңғы тіктөртбұрышқа өтеді, ал екіншісі «s» арқылы өтеді. Бізде «s» бар, сондықтан біз сонда барамыз.
- 10-позицияда біз жолдың соңындамыз және тек сөз шекарасы сәйкес келеді. Сызықтың соңы шекара болып саналады және біз соңғы тіктөртбұрыш арқылы өтеміз. Енді біз өз шаблонымызды сәтті таптық.

Негізінде, тұрақты өрнектердің жұмыс істеу тәсілі - алгоритм жолдың басынан басталады және сол жерден сәйкестікті табуға тырысады. Біздің жағдайда сөз шекарасы бар, сондықтан ол бірінші тіктөртбұрышты өтеді - бірақ ол жерде ешқандай сан жоқ, сондықтан ол екінші тіктөртбұрышқа сүрінді. Содан кейін ол жолдағы екінші таңбаға ауысады және сол жерде сәйкестікті табуға тырысады... Сәйкестікті тапқанша немесе жолдың соңына жеткенше, бұл жағдайда сәйкестік табылмайды.

Кері соққылар

/\b(+b|\d+|[\da-f]h)\b/ тұрақты өрнегі b бар екілік санға, жұрнағы жоқ ондық санға немесе он алтылық санға (0-ден 9-ға дейінгі сандар) сәйкес келеді. немесе a-дан h-қа дейінгі таңбалар), одан кейін h. Сәйкес диаграмма:

Сәйкестікті іздеу кезінде, жолда мұндай сан болмаса да, алгоритм жоғарғы жолды (екілік сан) алуы мүмкін. Мысалы, «103» жолы болса, 3 санына жеткеннен кейін ғана алгоритм оның дұрыс емес жолда екенін түсінетіні анық. Жалпы алғанда, сызық бұл ағында емес, әдеттегі реттілікке сәйкес келеді.

Содан кейін алгоритм кері оралады. Шанышқыда ол ағымдағы орынды есте сақтайды (біздің жағдайда бұл жолдың басы, сөздің шекарасынан кейін ғана), егер таңдалған жол жұмыс істемесе, кері қайтып, басқа жолды көруге болады. «103» жолы үшін үш кездескеннен кейін ол кері оралып, ондық жолдан өтуге тырысады. Бұл сәйкестік табылуы үшін жұмыс істейді.

Алгоритм толық сәйкестікті тапқан бойда тоқтайды. Бұл бірнеше опция қолайлы болуы мүмкін болса да, олардың тек біреуі ғана пайдаланылады (тұрақты реттілікте пайда болу ретімен).

Кері бақылау + және * сияқты қайталау операторларын пайдаланған кезде орын алады. Егер сіз "abcxe" жолында /^.*x/ іздесеңіз, regex бөлігі.* бүкіл жолды тұтынуға тырысады. Содан кейін алгоритм оған «x» қажет екенін түсінеді. Жолдың соңынан кейін «x» болмағандықтан, алгоритм бір таңбаны артқа жылжыту арқылы сәйкестікті іздеуге тырысады. abcx-тен кейін х жоқ, содан кейін ол қайтадан кері оралады, бұл жолы abc ішкі жолына. Жолдан кейін ол x мәнін табады және 0-ден 4-ке дейінгі позицияларда сәтті сәйкестік туралы хабарлайды.

Бірнеше кері қайтаруға әкелетін тұрақты жұмыс тәртібін жаза аласыз. Бұл мәселе үлгі енгізуге әртүрлі жолдармен сәйкес келетін кезде орын алады. Мысалы, екілік сандар үшін тұрақты өрнекті жазу кезінде қателессек, кездейсоқ /(+)+b/ сияқты бірдеңені жазуымыз мүмкін.

Алгоритм мұндай үлгіні 0 және 1-дің соңында «b» белгісі жоқ ұзын жолдан іздейтін болса, ол алдымен цифрлары таусылғанша ішкі цикл арқылы өтетін еді. Сосын соңында «б» жоқ екенін байқайды, ол бір позицияны артқа айналдырады, сыртқы ілмектен өтеді, қайтадан бас тартады, ішкі цикл бойымен басқа позицияға оралуға тырысады ... Және ол жалғастырады. екі циклді де пайдалана отырып, осы жолмен іздеу. Яғни, жолдың әрбір таңбасымен жұмыс көлемі екі есе артады. Тіпті бірнеше ондаған кейіпкерлер үшін сәйкестік табу өте ұзақ уақытты алады.

ауыстыру әдісі

Жолдарда жолдың бір бөлігін басқа жолмен алмастыра алатын ауыстыру әдісі бар.

Console.log("әке".replace("p", "m")); // → карта

Бірінші аргумент сондай-ақ тұрақты өрнек болуы мүмкін, бұл жағдайда жолдағы тұрақты өрнектің бірінші кездесуі ауыстырылады. Тұрақты өрнекке «g» (жаһандық) опциясы қосылғанда, біріншісі ғана емес, барлық оқиғалар ауыстырылады.

Console.log("Borobodur".replace(//, "a")); // → Barobudur console.log("Borobodur".replace(//g, "a")); // → Барабадар

«Барлығын ауыстыру» опциясын бөлек аргумент арқылы немесе replaceAll сияқты бөлек әдіс арқылы беру мағынасы бар. Бірақ, өкінішке орай, опция кәдімгі жүйенің өзі арқылы беріледі.

Тұрақты өрнектердің толық күші тұрақты өрнекте көрсетілген жолда табылған топтарға сілтемелерді пайдаланған кезде ашылады. Мысалы, бізде «Тегі, Аты» пішіміндегі адамдардың аттары, әр жолға бір атаудан тұратын жол бар. «Аты Тегі» алу үшін оларды ауыстырып, үтірді алып тастау қажет болса, біз келесіні жазамыз:

Console.log("Хоппер, Грейс\nМаккарти, Джон\nРитчи, Деннис" .replace(/([\w ]+), ([\w ]+)/g, "$2 $1")); // → Грейс Хоппер // Джон МакКарти // Деннис Ричи

Ауыстыру жолындағы $1 және $2 жақшаға алынған таңбалар тобына жатады. $1 бірінші топқа сәйкес келетін мәтінмен ауыстырылады, $2 екінші топпен және т.б. $9 дейін. Барлық сәйкестік $& айнымалысында қамтылған.

Сондай-ақ, функцияны екінші аргумент ретінде беруге болады. Әрбір ауыстыру үшін аргументтері табылған топтар (және жолдың барлық сәйкес бөлігі) болатын функция шақырылады және оның нәтижесі жаңа жолға кірістіріледі.

Қарапайым мысал:

Var s = «CIA және FBI»; console.log(s.replace(/\b(fbi|cia)\b/g, function(str) ( str.toUpperCase(); ))) қайтару; // → ЦРУ және ФБР

Міне, қызықтырақ:

Вар сорпасы = «1 лимон, 2 қырыққабат және 101 жұмыртқа»; функция минусБір(сәйкестік, сома, бірлік) ( сома = Сан(сома) - 1; егер (сома == 1) // бір ғана қалды, соңғы бірліктегі "s" таңбасын алып тастаңыз = unit.slice(0, бірлік. ұзындық - 1); ); // → лимон жоқ, 1 қырыққабат және 100 жұмыртқа

Код жолды алады, сөзден кейін сандардың барлық қайталануларын табады және әрбір сан бірге азайтылған жолды қайтарады.

Топ (\d+) сома аргументіне, ал (\w+) бірлік аргументіне өтеді. Функция соманы санға түрлендіреді - және бұл әрқашан жұмыс істейді, себебі біздің үлгі \d+. Содан кейін тек 1 элемент қалған жағдайда сөзге өзгерістер енгізеді.

Ашкөздік

JavaScript кодынан барлық түсініктемелерді алып тастайтын функцияны жазу үшін ауыстыруды пайдалану оңай. Міне, бірінші әрекет:

Функция stripComments(code) ( return code.replace(/\/\/.*|\/\*[^]*\*\//g, ""); ) console.log(stripComments("1 + /* 2 */3")); // → 1 + 3 console.log(stripComments("x = 10;// он!")); // → x = 10; console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 1

«немесе» операторының алдындағы бөлік жаңа жолдардан басқа кез келген таңбалар санынан кейінгі екі қиғаш сызыққа сәйкес келеді. Көп жолды түсініктемелерді алып тастайтын бөлік күрделірек. Біз [^] қолданамыз, яғни. кез келген кейіпкерді табудың жолы ретінде бос емес кез келген кейіпкер. Біз нүктені пайдалана алмаймыз, себебі блоктық түсініктемелер жаңа жолда жалғасады және жаңа жол таңбасы нүктеге сәйкес келмейді.

Бірақ алдыңғы мысалдың нәтижесі дұрыс емес. Неліктен?

[^]* бөлігі алдымен мүмкіндігінше көп таңбаны түсіруге тырысады. Осыған байланысты кәдімгі тізбектің келесі бөлігі сәйкестік таппаса, ол бір таңбаны кері айналдырып, әрекетті қайталайды. Мысалда алгоритм бүкіл жолды басып алуға тырысады, содан кейін кері оралады. 4 таңбаны кері айналдырып, ол жолда */ жолын табады - бұл біз қалағандай емес. Біз жолдың соңына дейін бармай, соңғы пікірді таппай, бір ғана пікірді алғымыз келді.

Осыған байланысты біз қайталау операторлары (+, *, ?, және ()) ашкөз деп айтамыз, яғни олар алдымен мүмкіндігінше ұстап алады, содан кейін кері кетеді. Егер сіз осындай оператордан кейін сұрақ қойсаңыз (+?, *?, ??, ()?), олар ашкөз еместерге айналады және мүмкін болатын ең кішкентай оқиғаларды таба бастайды.

Ал бізге керегі осы. Жұлдызшаны жолдағы таңбалардың ең аз ықтимал санынан сәйкестіктерді табуға мәжбүрлеу арқылы біз тек бір ғана түсініктеме блогын пайдаланамыз, басқа ештеңе емес.

Функция stripComments(code) ( return code.replace(/\/\/.*|\/\*[^]*?\*\//g, ""); ) console.log(stripComments("1 /* a */+/* b */ 1")); // → 1 + 1

Ашкөз емес операторлардың орнына ашкөз операторларды қолданғанда көптеген қателер орын алады. Қайталау операторын пайдаланған кезде әрқашан алдымен ашкөз емес операторды қарастырыңыз.

RegExp нысандарын динамикалық түрде жасау

Кейбір жағдайларда код жазылған кезде нақты үлгі белгісіз болады. Мысалы, мәтіннен пайдаланушының атын іздеп, оны астыңғы сызықпен қоршау керек. Бағдарламаны іске қосқаннан кейін ғана атауды білетіндіктен, қиғаш сызық белгісін пайдалана алмайсыз.

Бірақ жолды құрастыруға және RegExp конструкторын пайдалануға болады. Міне, мысал:

Var name = «гарри»; var text = "Ал Гарридің маңдайында тыртық бар."; var regexp = new RegExp("\\b(" + name + ")\\b", "gi"); console.log(text.replace(regexp, "_$1_")); // → Ал _Гарридің маңдайында тыртық бар.

Сөз шекараларын жасағанда біз қос қиғаш сызықтарды қолдануымыз керек, өйткені біз оларды тура сызықпен емес, қалыпты қатарда жазамыз. RegExp-тің екінші аргументі тұрақты өрнектерге арналған опцияларды қамтиды - біздің жағдайда «gi», яғни. ғаламдық және регистрді сезбейді.

Бірақ егер аты «dea+hlrd» болса ше (біздің қолданушымыз kulhatzker болса)? Нәтижесінде біз жолда сәйкестік таба алмайтын мағынасыз тұрақты өрнек аламыз.

Біз кез келген ұнамайтын таңбаның алдында кері қиғаш сызықтарды қоса аламыз. Біз әріптердің алдына кері қиғаш сызықтарды қоса алмаймыз, себебі \b немесе \n арнайы таңбалар. Бірақ кез келген әріптік-сандық емес таңбалардың алдына қиғаш сызықтарды еш қиындықсыз қосуға болады.

Var name = "dea+hlrd"; var text = "Бұл dea+hlrd барлығын тітіркендіреді."; var escaped = name.replace(/[^\w\s]/g, "\\$&"); var regexp = new RegExp("\\b(" + escaped + ")\\b", "gi"); console.log(text.replace(regexp, "_$1_")); // → Бұл _деа+хлрд_ барлығын ренжітті.

іздеу әдісі

indexOf әдісін тұрақты өрнектермен пайдалану мүмкін емес. Бірақ тұрақты өрнекті күтетін іздеу әдісі бар. indexOf сияқты, ол бірінші орынның индексін қайтарады немесе ешқайсысы болмаса -1 мәнін береді.

Console.log("word".search(/\S/)); // → 2 console.log(" ".search(/\S/)); // → -1

Өкінішке орай, белгілі бір ығысудан басталатын сәйкестікті іздеу әдісін айтудың ешқандай жолы жоқ (indexOf көмегімен жасай алатындай). Бұл пайдалы болар еді.

lastIndex сипаты

exec әдісі жолдағы берілген позициядан іздеуді бастаудың ыңғайлы әдісін де қамтамасыз етпейді. Бірақ бұл ыңғайсыз жол береді.

Regex нысанының қасиеттері бар. Олардың бірі жолды қамтитын көз болып табылады. Тағы біреуі - lastIndex, ол кейбір жағдайларда оқиғаларды келесі іздеу басталатын жерді басқарады.

Бұл шарттарға жаһандық опция g болуы керек және іздеу exec әдісі арқылы орындалуы керек. Неғұрлым ақылға қонымды шешім қосымша дәлелді exec-ке жіберуге рұқсат беру болар еді, бірақ парасаттылық JavaScript regex интерфейсінің негізгі ерекшелігі болып табылмайды.

Var үлгісі = /y/g; pattern.lastIndex = 3; var match = pattern.exec("xyzzy"); console.log(матч.индекс); // → 4 console.log(pattern.lastIndex); // → 5

Іздеу сәтті болса, exec шақыруы lastIndex сипатын табылған оқиғадан кейінгі орынды көрсету үшін жаңартады. Сәтті болмаса, lastIndex нөлге орнатылады - дәл жаңадан жасалған нысанның lastIndex сияқты.

Ғаламдық тұрақты айнымалыны және бірнеше орындаушы қоңырауларды пайдаланған кезде, бұл lastIndex автоматты жаңартулары ақаулық тудыруы мүмкін. Сіздің тұрақты қызметіңіз іздеуді алдыңғы қоңыраудан қалған позициядан бастай алады.

Var цифры = /\d/g; console.log(digit.exec("мұнда: 1")); // → ["1"] console.log(digit.exec("және қазір: 1")); // → нөл

g опциясының тағы бір қызықты әсері - сәйкестік әдісінің жұмыс істеу жолын өзгертеді. Осы опциямен шақырылғанда, exec нәтижесіне ұқсас массивті қайтарудың орнына, ол жолдағы үлгінің барлық көріністерін табады және табылған ішкі жолдардың массивін қайтарады.

Console.log("Банан".match(/an/g)); // → ["an", "an"]

Сондықтан жаһандық тұрақты айнымалылармен абай болыңыз. Олар қажет болған жағдайлар - қоңырауларды немесе lastIndex арнайы пайдаланатын орындарды ауыстырыңыз - олар пайдаланылуы керек барлық жағдайлар болуы мүмкін.

Пайда болу циклдері

Әдеттегі тапсырма жолдағы үлгінің барлық көріністері арқылы қайталау болып табылады, осылайша ол lastIndex және exec көмегімен циклдің негізгі бөлігіндегі сәйкестік нысанына қол жеткізе алады.

Var input = "3 саны бар жол... 42 және 88."; var number = /\b(\d+)\b/g; var сәйкестік; while (сәйкестік = number.exec(енгізу)) console.log("Табылды", сәйкестік, " қосулы", match.index); // → 3-тен 14-ке дейін табылды // 42-ден 33-ке дейін табылды // 88-ден 40-қа дейін табылды

Ол тапсырманың мәні тағайындалатын мән болатынын пайдаланады. Уақыт цикліндегі шарт ретінде match = re.exec(input) пайдалану арқылы біз әрбір итерацияның басында іздейміз, нәтижені айнымалы мәнде сақтаймыз және барлық сәйкестіктер табылған кезде циклды аяқтаймыз.

INI файлдарын талдау

Тарауды қорытындылау үшін тұрақты тіркестерді қолданып есепті қарастырайық. Елестетіп көріңізші, біз интернет арқылы жауларымыз туралы ақпаратты автоматты түрде жинайтын бағдарлама жазып жатырмыз. (Біз толық бағдарламаны жазбаймыз, тек параметрлер файлын оқитын бөлігін ғана жазамыз. Кешіріңіз.) Файл келесідей көрінеді:

Searchengine=http://www.google.com/search?q=$1 өшпенділік=9.7 ; түсініктемелердің алдына нүктелі үтір қойылады; әр бөлім басқа жауға сілтеме жасайды толық аты=Ларри Дое түрі=балабақша бұқасының веб-сайты=http://www.geocities.com/CapeCanaveral/11451 fullname=Gargamel type=evil wizard outputdir=/home/marijn/enemies/gargamel

Нақты файл пішімі (ол өте кең таралған және әдетте INI деп аталады) келесідей:

Бос жолдар мен нүктелі үтірден басталатын жолдар еленбейді
- шаршы жақшаға алынған жолдар жаңа бөлімді бастайды
- әріптік-сандық идентификаторды қамтитын жолдар, одан кейін = осы бөлімге параметрді қосыңыз

Қалғанының бәрі дұрыс емес деректер.

Біздің міндетіміз - мұндай жолды әрқайсысының атау сипаты мен параметрлер массиві бар объектілер массивіне түрлендіру. Әрбір бөлім үшін бір нысан қажет, ал екіншісі файлдың жоғарғы жағындағы ғаламдық параметрлер үшін қажет.

Файлды жол бойынша талдау қажет болғандықтан, файлды жолдарға бөлуден бастаған дұрыс. Ол үшін 6-тарауда string.split("\n") қолдандық. Кейбір операциялық жүйелер жол үзілімдері үшін бір \n таңбаны емес, екі - \r\n таңбасын пайдаланады. Бөлу әдісі тұрақты өрнектерді аргумент ретінде қабылдағандықтан, /\r?\n/ өрнегі арқылы жолдарды бөлуге болады, бұл жолдар арасында жалғыз \n және \r\n болуына мүмкіндік береді.

Функция parseINI(жол) ( // Жоғарғы деңгей параметрлері бар нысаннан бастайық var currentSection = (атауы: null, өрістер: ); var category = ; string.split(/\r?\n/).forEach(функция). (сызық ) ( var сәйкестік; егер (/^\s*(;.*)?$/.test(сызық)) (қайтару; ) басқа болса (сәйкестік = line.match(/^\[(.*)\ ]$ /)) ( currentSection = (аты: сәйкестік, өрістер: ); category.push(currentSection); ) басқа болса (сәйкестік = line.match(/^(\w+)=(.*)$/)) ( currentSection fields.push((аты: сәйкестік, мән: сәйкестендіру));

Код «ағымдағы бөлім» ағымдағы бөлім объектісін жаңарта отырып, барлық жолдардан өтеді. Біріншіден, ол /^\s*(;.*)?$/ тұрақты өрнегі арқылы жолды елемеу мүмкіндігін тексереді. Бұл қалай жұмыс істейтінін елестете аласыз ба? Жақшалар арасындағы бөлік түсініктемелерге сәйкес келеді, иә? тұрақты таңба тек бос орындардан тұратын жолдарға сәйкес келетін етіп жасайды.

Егер жол түсініктеме болмаса, код оның жаңа бөлімді бастайтынын тексереді. Егер иә болса, ол келесі параметрлер қосылатын ағымдағы бөлім үшін жаңа нысан жасайды.

Соңғы мағыналы мүмкіндік - бұл жол қалыпты параметр болып табылады, бұл жағдайда ол ағымдағы нысанға қосылады.

Опциялардың ешқайсысы жұмыс істемесе, функция қате жібереді.

^ және $ жиі қолданылуы өрнектің оның бір бөлігін емес, бүкіл жолға сәйкес келетінін қалай қамтамасыз ететініне назар аударыңыз. Оларды пайдаланбасаңыз, код әдетте жұмыс істейді, бірақ кейде біртүрлі нәтижелер береді және қатені қадағалау қиын болады.

if (матч = string.match(...)) конструкциясы уақытша циклдегі шарт ретінде тағайындауды пайдалану трюкіне ұқсас. Көбінесе сіз сәйкестік қоңырауының сәтті болатынын білмейсіз, сондықтан оны тексеретін if блогының ішіндегі нәтиже нысанына ғана қол жеткізе аласыз. If чектерінің әдемі тізбегін бұзбау үшін біз іздеу нәтижесін айнымалыға тағайындаймыз және бұл тапсырманы чек ретінде дереу пайдаланамыз.

Халықаралық рәміздер

Бастапқыда тілдің қарапайым орындалуына және кейіннен мұндай іске асырудың «гранитте» бекітілуіне байланысты JavaScript тұрақты өрнектері ағылшын тілінде кездеспейтін таңбалармен ақымақ. Мысалы, JavaScript тұрақты өрнектері тұрғысынан «әріп» таңбасы ағылшын алфавитіндегі 26 әріптің бірі болуы мүмкін және қандай да бір себептермен астын сызу болуы мүмкін. é немесе β сияқты әріптер анық әріптер \w сәйкес келмейді (және әріп емес \W сәйкес келеді).

Біртүрлі бұрылыста тарихи \s (бос орын) Юникодта бос орын болып саналатын барлық таңбаларға, соның ішінде үзілмейтін кеңістік немесе моңғол дауысты бөлгіші сияқты нәрселерге сәйкес келеді.

Басқа тілдердегі кейбір регекс енгізулерінде «барлық бас әріптер», «барлық тыныс белгілері» немесе «басқару таңбалары» сияқты Юникод таңбаларының арнайы санаттарын іздеуге арналған арнайы синтаксис бар. JavaScript-ке мұндай санаттарды қосу жоспарлары бар, бірақ олар жақын арада жүзеге аспайтын сияқты.

Төменгі сызық

Регулярлар жолдардағы іздеу үлгілерін көрсететін нысандар. Бұл үлгілерді білдіру үшін олар өздерінің синтаксисін пайдаланады.

/abc/ Таңбалар тізбегі
// Тізімдегі кез келген символ
/[^abc]/ Тізімдегі таңбалардан басқа кез келген таңба
// Интервалдағы кез келген символ
/x+/ x үлгісінің бір немесе бірнеше қайталануы
/x+?/ Бір немесе бірнеше көрініс, ашкөз емес
/x*/ Нөл немесе одан да көп оқиғалар
/x?/ Нөл немесе бір оқиға
/x(2,4)/ Екіден төртке дейін
/(abc)/ Топ
/a|b|c/ Бірнеше үлгінің кез келгені
/\d/ Кез келген сан
/\w/ Кез келген әріптік-цифрлық таңба («әріп»)
/\s/ Кез келген бос орын таңбасы
/./ Жол үзілімінен басқа кез келген таңба
/\b/ Сөз шекарасы
/^/ Жолдың басы
/$/ Жолдың соңы

Регексте үлгінің жолда бар-жоғын тексеру үшін сынақ әдісі бар. Табылған барлық топтардан тұратын массивді қайтаратын exec әдісі бар. Массивте сәйкестік орын алған таңбаның нөмірін қамтитын индекс қасиеті бар.

Жолдарда үлгілерді сәйкестендіру үшін сәйкестік әдісі және оқиғаның тек бастапқы орнын қайтаратын іздеу әдісі бар. Ауыстыру әдісі үлгінің қайталануын басқа жолмен ауыстыра алады. Бұған қоса, үлгіге және табылған топтарға негізделген ауыстыру жолын құрайтын ауыстыру функциясын беруге болады.

Тұрақты таңбаларда жабу қиғаш сызықтан кейін жазылатын параметрлер бар. i опциясы тұрақты өрнекті регистрге сезімтал емес етеді, ал g опциясы оны жаһандық етеді, бұл басқа нәрселермен қатар ауыстыру әдісінің біріншісін ғана емес, табылған барлық оқиғаларды ауыстыруын тудырады.

RegExp конструкторын жолдардан тұрақты өрнектер жасау үшін пайдалануға болады.

Реттегіштер – ыңғайсыз тұтқасы бар өткір құрал. Олар кейбір тапсырмаларды айтарлықтай жеңілдетеді және басқа күрделі мәселелерді шешу кезінде басқарылмайтын болуы мүмкін. Регекстерді пайдалануды үйренудің бір бөлігі - оларды арналмаған тапсырмамен толтыру азғыруына қарсы тұру.

Жаттығулар

Мәселелерді шешу барысында еріксіз түсініксіз жағдайларға тап болады, кейбір тұрақты тіркестердің болжауға келмейтін мінез-құлқын көргенде кейде түңіліп кетуіңіз мүмкін. Кейде бұл debuggex.com сияқты онлайн сервис арқылы кәдімгі қозғалтқыштың әрекетін зерттеуге көмектеседі, онда оның визуализациясын көруге және оны қажетті әсермен салыстыруға болады.
Кәдімгі гольф
Кодтағы «Гольф» - бұл берілген бағдарламаны таңбалардың ең аз санымен көрсету керек ойын. Тұрақты гольф - бұл берілген үлгіні табу үшін мүмкін болатын ең кішкентай тұрақтыларды жазудағы практикалық жаттығу және тек осы.

Ішкі жолдардың әрқайсысы үшін олардың жолдағы орнын тексеру үшін тұрақты өрнек жазыңыз. Тұрақты қозғалтқыш тек осы көрсетілген ішкі жолдарды табуы керек. Арнайы айтылмаса, сөз шекаралары туралы алаңдамаңыз. Жұмыс істейтін қалыпты үлгі болған кезде, оны азайтып көріңіз.

Көлік пен мысық
- поп және проп
- паром, паром және феррари
- ious дыбысымен аяқталатын кез келген сөз
- Бос орыннан кейін нүкте, үтір, қос нүкте немесе нүктелі үтір.
- Алты әріптен ұзын сөз
- әріпсіз сөз e

// Тұрақты өрнектеріңізді енгізіңіз verify(/.../, ["менің көлігім", "жаман мысықтар"], ["camper", "high art"]); verify(/.../, ["популярное культуры", "mad реквизиттер"], ["plop"]); verify(/.../, ["паром", "паром", "феррари"], ["ferrum", "transfer A"]); verify(/.../, ["қандай дәмді", "кең бөлме"], ["қираған", "сана"]); verify(/.../, ["нашар тыныс белгісі."], ["нүктеден құтылу"]); verify(/.../, ["hottenottententen"], ["жоқ", "hotten totten tenten"]); verify(/.../, ["қызыл платипус", "солқылдаған ұя"], ["жер төсегі", "үйренетін маймыл"]); function verify(regexp, иә, жоқ) ( // Аяқталмаған жаттығуларды елемеу егер (regexp.source == "...") қайтарылады; yes.forEach(функция(лар) ( егер (!regexp.test(s))) консолі .log("Табылмады "" + s + """ ) no.forEach(функция(лар) егер (regexp.test(s)) console.log("Күтпеген жағдай "" + s + " "" );

Мәтіндегі дәйексөздер
Сіз әңгіме жаздыңыз және диалогты көрсету үшін жалғыз тырнақшаларды қолдандыңыз делік. Енді сіз диалогтық тырнақшаларды қос тырнақшаға ауыстырғыңыз келеді және жалғыз тырнақшаларды емес сияқты сөздердің аббревиатурасында қалдырыңыз.

Тырнақшалардың осы екі қолданылуын ажырататын үлгіні ойлап табыңыз және ауыстыруды орындайтын ауыстыру әдісіне қоңырау шалыңыз.

Қайтадан сандар
Сандар тізбегін /\d+/ қарапайым тұрақты өрнек арқылы табуға болады.

JavaScript стилінде жазылған сандарды ғана табатын өрнекті жазыңыз. Ол санның алдындағы ықтимал минусты немесе плюсті, ондық бөлшекті және 5e-3 немесе 1E10 ғылыми белгісін қолдауы керек - қайтадан ықтимал плюс немесе минус. Сондай-ақ, нүктенің алдында немесе одан кейін міндетті түрде сандар болмауы мүмкін екенін ескеріңіз, бірақ сан бір нүктеден тұруы мүмкін емес. Яғни, .5 немесе 5. жарамды сандар, бірақ бір нүкте өздігінен болмайды.

// Мұнда тұрақты ретті енгізіңіз. var number = /^...$/; // Тесттер: ["1", "-1", "+15", "1.55", ".5", "5.", "1.3e2", "1E-4", "1e+12"] .forEach(функция(лар) ( if (!number.test(s)) console.log(""" + s + """ табылмады); )); ["1a", "+-1", "1.2.3", "1+1", "1e4.5", ".5.", "1f5", "."].forEach(функциялар) ( if (number.test(s)) console.log("Қате қабылданған "" + s + """); ));

Бұл мақала Javascript-те тұрақты өрнектерді пайдалану негіздерін қарастырады.

Кіріспе

Тұрақты өрнек дегеніміз не?

JS тұрақты өрнек - іздеу ережесін құрайтын таңбалар тізбегі. Бұл ережені мәтін бойынша іздеу және оны ауыстыру үшін пайдалануға болады. Тәжірибеде тұрақты өрнек тіпті бір таңбадан тұруы мүмкін, бірақ күрделірек іздеу үлгілері жиі кездеседі.

Javascript тілінде тұрақты өрнектер де нысан болып табылады. Бұл жолдардағы таңбалар тізбегін сәйкестендіру үшін қолданылатын үлгілер. Олар RegExp нысанының exec() және test() әдістерінде және String нысанының match(), replace(), іздеу және split() әдістерінде қолданылады.

Мысал

var үлгісі = /мысал/i

/мысал/i тұрақты өрнек. мысал үлгі ( ол іздеуде пайдаланылады). i регистр сезімталдығын көрсететін модификатор.

Тұрақты сөз тіркесін дайындау

JS тұрақты өрнектері үлгі мен модификатордан тұрады. Синтаксис келесідей болады:

/үлгі/модификаторлар;

Үлгі іздеу ережесін көрсетеді. Ол /abc/ сияқты қарапайым таңбалардан немесе қарапайым және арнайы таңбалардың тіркесімінен тұрады: /abc/ немесе /Бөлім (d+).d/ .

Үлгілер кестесі

Модификаторлар сұрауларды регистрге, ғаламдық және т.б. жасауға мүмкіндік береді. Олар регистрді ескеретін іздеулерді, сондай-ақ ғаламдық іздеулерді жүргізу үшін қолданылады.

Модификаторлар кестесі

Енді біз JS тұрақты өрнектерін қолдануға дайынбыз. Мұны істеудің екі негізгі жолы бар: тұрақты өрнек нысанын немесе жолда тұрақты өрнекті пайдалану.

Тұрақты өрнек нысанын пайдалану

Тұрақты өрнек нысанын жасаңыз

Бұл нысан таңба үлгісін сипаттайды. Ол үлгіні сәйкестендіру үшін қолданылады. Тұрақты өрнек нысанын құрудың екі жолы бар.

1-әдіс: қиғаш сызықтармен қамтылған үлгіден тұратын тұрақты өрнек литералын пайдалану, мысалы:

var reg = /ab+c/;

Тұрақты өрнек литералдары сценарийді талдау кезінде тұрақты өрнектің алдын ала құрастырылуын іске қосады. Тұрақты өрнек тұрақты болса, өнімділікті жақсарту үшін оны пайдаланыңыз.

2-әдіс: RegExp нысанының конструктор функциясын шақыру, мысалы:

var reg = new RegExp("ab+c");

Конструкторды пайдалану сценарий жұмыс істеп тұрған кезде JS тұрақты өрнекті құрастыруға мүмкіндік береді. Тұрақты өрнек өзгеретін болса немесе үлгіні алдын ала білмесеңіз, бұл әдісті пайдаланыңыз. Мысалы, іздеу сұрауын енгізген пайдаланушыдан ақпарат алсаңыз.

Тұрақты өрнек нысанының әдістері

Бірнеше жалпы тұрақты өрнек нысанының әдістерін қарастырайық:

  • компиляция()( 1.5 нұсқасында ескірген) – тұрақты тіркесті құрастырады;
  • exec() - Жол сәйкестігін орындайды. Бірінші сәйкестікті қайтарады;
  • test() - жолда сәйкестікті орындайды. ақиқат немесе жалған мәнін береді;
  • toString() – тұрақты өрнектің жол мәнін қайтарады.

Мысалдар

test() пайдалану

test() әдісі RegExp нысанының тұрақты өрнегі болып табылады. Ол үлгі жолын іздейді және нәтижеге байланысты ақиқат немесе жалған мәнін қайтарады. Келесі JS тұрақты өрнек мысалы жолдың « таңбасын қалай іздейтінін көрсетеді. e”:

var patt = /e/; patt.test («Әлемдегі ең жақсы нәрселер тегін!»);

Өйткені мұнда жолда « e”, осы кодтың нәтижесі ақиқат болады.

Тұрақты өрнектерді айнымалыға орналастыру міндетті емес. Сол сұрауды бір жолда орындауға болады:

/e/.test("Дүниедегі ең жақсы нәрселер тегін!");

exec() пайдалану

Ол берілген іздеу ережесін пайдаланып жолды іздейді және табылған мәтінді қайтарады. Сәйкестік табылмаса, нәтиже null болады.

Сол таңбаның мысалын қолдана отырып, әрекеттегі әдісті қарастырайық. e”:

/e/.exec("Дүниедегі ең жақсы нәрселер тегін!");

Жолда « e”, осы кодтың нәтижесі .e болады.

Жолға тұрақты өрнекті қолдану

Javascript тілінде бұл өрнектерді String нысанының екі әдісімен де қолдануға болады: search() және replace(). Олар мәтінде іздеу және ауыстыру үшін қажет.

  • search() әдісі – сәйкестікті іздеу үшін өрнекті пайдаланады және сәйкестіктің орны туралы ақпаратты қайтарады;
  • replace() әдісі ауыстырылған үлгімен өзгертілген жолды қайтарады.

Мысалдар

JS тұрақты өрнекті пайдалану « фразасы үшін регистрді ескере отырып іздеуді орындау w3schools» жолында:

var str = "W3Schools сайтына барыңыз"; var n = str.search(/w3schools/i);

n-дегі нәтиже 6 болады.

Іздеу әдісі де аргумент ретінде жолды қабылдайды. Жол аргументі тұрақты өрнекке түрлендіріледі:

Сөз тіркесін іздеу үшін жолды пайдалану W3 мектептері” қатарында.

Таңдау