Js kutokea kwa kamba ndogo. Njia za JavaScript za kufanya kazi na kamba. Kitu cha Kamba kilichojengwa ndani

Katika JavaScript, misemo ya kawaida inawakilishwa na vipengee vya RegExp. Vitu vya RegExp vinaweza kuundwa kwa kutumia kijenzi cha RegExp(), lakini mara nyingi zaidi huundwa kwa kutumia sintaksia maalum halisi. Kama vile maandishi ya mfuatano yanavyobainishwa kama vibambo vilivyoambatanishwa katika alama za nukuu, tamathali za usemi wa kawaida hubainishwa kama herufi zilizoambatanishwa katika jozi ya kufyeka / .

/pattern/flags new RegExp("muundo"[, chaguzi za utafutaji])

muundo- usemi wa kawaida wa kutafuta (zaidi juu ya uingizwaji baadaye), na bendera - safu ya mchanganyiko wowote wa wahusika g (utafutaji wa kimataifa), i (kesi sio muhimu) na m (utafutaji wa safu nyingi). Njia ya kwanza hutumiwa mara nyingi, ya pili - wakati mwingine. Kwa mfano, simu mbili kama hizo ni sawa.

Chaguzi za utafutaji

Wakati wa kuunda usemi wa kawaida, tunaweza kutaja chaguzi za ziada za utafutaji

Herufi katika Maneno ya Kawaida ya JavaScript

AlamaMawasiliano
Wahusika wa alphanumericSambamba na wao wenyewe
\0 herufi NUL (\u0000)
\tKichupo (\u0009)
\nMlisho wa laini (\u000A)
\vKichupo cha wima (\u000B)
\fTafsiri ya ukurasa (\u000C)
\rUrejeshaji wa gari (\u000D)
\xnnHerufi kutoka seti ya Kilatini, iliyobainishwa na nambari ya heksadesimali nn; kwa mfano, \x0A ni sawa na \n
\xxxxherufi ya Unicode iliyobainishwa na nambari ya heksadesimali xxxx; kwa mfano, \u0009 ni sawa na \t
\cXHerufi ya kudhibiti "X", kwa mfano, mlolongo \cJ ni sawa na herufi mpya \n.
\ Kwa wahusika wa kawaida - huwafanya kuwa maalum. Kwa mfano, usemi /s/ hutafuta tu mhusika "s". Na ikiwa utaweka \ kabla ya s, basi /\s/ tayari inaashiria herufi ya nafasi.Na kinyume chake, ikiwa mhusika ni maalum, kwa mfano *, basi \ itaifanya kuwa herufi ya kawaida ya "nyota". Kwa mfano, /a*/ hutafuta herufi 0 au zaidi mfululizo za "a". Ili kupata na nyota "a*" - weka \ mbele ya maalum. ishara: /a\*/ .
^ Inaonyesha mwanzo wa data ya ingizo. Ikiwa alama ya utafutaji ya mistari mingi ("m") imewekwa, itawaka pia mwanzoni mwa mstari mpya. Kwa mfano, /^A/ hatapata "A" katika "A", lakini atapata ya kwanza. "A" katika "An A."
$ Inaonyesha mwisho wa data ya ingizo. Ikiwa alama ya utafutaji ya laini nyingi imewekwa, itafanya kazi pia mwishoni mwa mstari. Kwa mfano, /t$/ haitapata "t" katika "eater", lakini itaipata katika "kula".
* Inaonyesha marudio 0 au zaidi. Kwa mfano, /bo*/ utapata "boooo" katika "Ghost booooed" na "b" katika "A bird warbled", lakini hawatapata chochote katika "Mbuzi aliyeguna".
+ Inaonyesha kurudia mara 1 au zaidi. Sawa na (1,). Kwa mfano, /a+/ italingana na "a" katika "pipi" na "a" yote katika "caaaaaaandy".
? Inaonyesha kuwa kipengele kinaweza kuwepo au kisiwepo. Kwa mfano, /e?le?/ italingana na "el" katika "angel" na "le" katika "pembe." Ikitumiwa mara tu baada ya mojawapo ya vidhibiti * , + , ? , au () , kisha hubainisha utafutaji "usio na pupa" (kurudia idadi ya chini ya nyakati iwezekanavyo, kwa kipengele cha muundo kilicho karibu zaidi), kinyume na hali ya "choyo" chaguo-msingi, ambayo huongeza idadi ya marudio, hata kama kipengee cha muundo kinachofuata pia kinalingana. kutumika katika onyesho la kukagua, ambalo limefafanuliwa kwenye jedwali chini ya (?=) , (?!) , na (?:) .
. (Pointi ya decimal) inawakilisha herufi yoyote isipokuwa laini mpya: \n \r \u2028 au \u2029. (unaweza kutumia [\s\S] kutafuta herufi yoyote, ikijumuisha mistari mpya). Kwa mfano, /.n/ italingana na "an" na "on" katika "la, tufaha liko kwenye mti", lakini sio "la".
(x)Hupata x na kukumbuka. Hii inaitwa "mabano ya kumbukumbu". Kwa mfano, /(foo)/ atapata na kukumbuka "foo" katika "foo bar." Mstari mdogo uliopatikana umehifadhiwa katika safu ya matokeo ya utafutaji au katika sifa zilizobainishwa awali za kipengee cha RegExp: $1, ..., $9. Zaidi ya hayo, mabano huchanganya kilichomo ndani yake kuwa kipengele cha muundo mmoja. Kwa mfano, (abc)* - kurudia abc mara 0 au zaidi.
(?:x)Hupata x, lakini haikumbuki inapata nini. Hii inaitwa "mabano ya kumbukumbu". Mstari mdogo uliopatikana haujahifadhiwa katika safu ya matokeo na sifa za RegExp. Kama vile mabano yote, huchanganya kilicho ndani yake kuwa muundo mmoja mdogo.
x(?=y)Hupata x ikiwa tu x inafuatwa na y. Kwa mfano, /Jack(?=Sprat)/ italingana na "Jack" tu ikiwa itafuatiwa na "Sprat". /Jack(?=Sprat|Frost)/ italingana na "Jack" tu ikiwa itafuatiwa na "Sprat" au "Frost". Walakini, sio "Sprat" au "Frost" haitaonekana kwenye matokeo ya utaftaji.
x(?!y)Hupata x ikiwa tu x haijafuatwa na y. Kwa mfano, /\d+(?!\.)/ italingana na nambari tu ikiwa haijafuatwa na nukta ya desimali. /\d+(?!\.)/.exec("3.141") utapata 141, lakini si 3.141.
x|yHupata x au y. Kwa mfano, /kijani|nyekundu/ italingana na "kijani" katika "tufaa la kijani" na "nyekundu" katika "tufaha jekundu."
(n)Ambapo n ni nambari chanya. Hupata marudio n ya kipengele kilichotangulia. Kwa mfano, /a(2)/ haitapata "a" katika "pipi," lakini itapata a katika "caandy," na a's mbili za kwanza katika "caaandy."
(n,)Ambapo n ni nambari chanya. Hupata n au zaidi marudio ya kipengele. Kwa mfano, /a(2,) haitapata "a" katika "pipi", lakini itapata "a" yote katika "caandy" na katika "caaaaaaandy."
(n,m)Ambapo n na m ni nambari chanya. Tafuta kutoka n hadi m marudio ya kipengele.
Seti ya wahusika. Hupata wahusika wowote kati ya walioorodheshwa. Unaweza kuonyesha nafasi kwa kutumia dashi. Kwa mfano, - sawa na. Inalingana "b" katika "brisket" na "a" na "c" katika "ache".
[^xyz]Herufi yoyote isipokuwa zile zilizobainishwa kwenye seti. Unaweza pia kutaja span. Kwa mfano, [^abc] ni sawa na [^a-c] . Hupata "r" katika "brisket" na "h" katika "kata."
[\b]Hupata herufi ya nafasi ya nyuma. (Isichanganywe na \b .)
\bHupata mpaka wa maneno (Kilatini), kama vile nafasi. (Isichanganywe na [\b]). Kwa mfano, /\bn\w/ italingana na "hapana" katika "mchana"; /\wy\b/ utapata "ly" katika "labda jana."
\BHaionyeshi mpaka wa neno. Kwa mfano, /\w\Bn/ italingana na "siku" katika "mchana", na /y\B\w/ italingana na "ye" katika "labda jana."
\cXAmbapo X ni herufi kutoka A hadi Z. Huonyesha herufi ya udhibiti katika mfuatano. Kwa mfano, /\cM/ inawakilisha herufi Ctrl-M.
\dhupata nambari kutoka kwa alfabeti yoyote (yetu ni Unicode). Tumia kupata nambari za kawaida pekee. Kwa mfano, /\d/ au // italingana na "2" katika "B2 ni nambari ya Suite."
\DHupata herufi isiyo ya nambari (alfabeti zote). [^0-9] ni sawa na nambari za kawaida. Kwa mfano, /\D/ au /[^0-9]/ italingana na "B" katika "B2 ni nambari ya mpangilio."
\sHupata herufi yoyote ya nafasi nyeupe, ikiwa ni pamoja na nafasi, kichupo, laini mpya na vibambo vingine vya Unicode. Kwa mfano, /\s\w*/ italingana na "bar" katika "foo bar."
\SHupata mhusika yeyote isipokuwa nafasi nyeupe. Kwa mfano, /\S\w*/ italingana na "foo" katika "foo bar."
\vHerufi ya kichupo cha wima.
\wHupata herufi za neno lolote (Alfabeti ya Kilatini), ikijumuisha herufi, nambari na mistari chini. Sawa. Kwa mfano, /\w/ italingana na "a" katika "apple," "5" katika "$5.28," na "3" katika "3D."
\WHupata herufi yoyote isiyo ya (Kilatini) ya maneno. Sawa na [^A-Za-z0-9_] . Kwa mfano, /\W/ na /[^$A-Za-z0-9_]/ zitalingana kwa usawa "%" katika "50%."

Kufanya kazi na Maneno ya Kawaida katika Javascript

Kufanya kazi na misemo ya kawaida katika Javascript inatekelezwa na njia za darasa la String

exec(regexp) - hupata mechi zote (viingizo katika muundo wa kawaida) kwenye kamba. Hurejesha safu (ikiwa kuna inayolingana) na kusasisha sifa ya regexp, au batili ikiwa hakuna kitu kinachopatikana. Na g modifier - kila kazi hii inapoitwa, itarudisha mechi inayofuata baada ya ile ya awali kupatikana - hii inatekelezwa kwa kudumisha faharisi ya kukabiliana na utafutaji wa mwisho.

match(regexp) - pata sehemu ya kamba kwa kutumia muundo. Ikiwa kirekebishaji cha g kimebainishwa, basi match() hurejesha safu ya mechi zote au batili (badala ya safu tupu). Bila kirekebishaji cha g, kazi hii inafanya kazi kama exec();

test(regexp) - kazi hukagua kamba ili kulinganisha muundo. Hurejesha kweli ikiwa kuna mechi, na sivyo kama hakuna inayolingana.

split(regexp) - Hugawanya mfuatano unaoitwa katika safu ndogo, kwa kutumia hoja kama kitenganishi.

replace(regexp, mix) - njia inarudisha kamba iliyorekebishwa kwa mujibu wa template (kujieleza mara kwa mara). Kigezo cha kwanza cha regexp pia kinaweza kuwa kamba badala ya usemi wa kawaida. Bila kirekebishaji cha g, njia kwenye mstari inachukua nafasi ya tukio la kwanza tu; na modifier g - uingizwaji wa kimataifa hutokea, i.e. matukio yote katika mstari fulani yanabadilishwa. mchanganyiko - template badala, inaweza kukubali maadili ya kamba, template badala, kazi (jina la kazi).

Wahusika maalum katika kamba ya uingizwaji

Uingizwaji kupitia chaguo la kukokotoa

Ukitaja chaguo la kukokotoa kama parameta ya pili, inatekelezwa kwa kila mechi. Chaguo za kukokotoa zinaweza kuzalisha na kurejesha kamba mbadala. Kigezo cha kwanza cha chaguo za kukokotoa ni kamba ndogo iliyopatikana. Ikiwa hoja ya kwanza ya kuchukua nafasi ni kitu cha RegExp, basi vigezo vya n vifuatavyo vina mlinganisho wa mabano. Vigezo viwili vya mwisho ni nafasi katika mstari ambapo mechi ilitokea na mstari yenyewe.

Virekebishaji

Alama ya kutoa (-) iliyowekwa kando ya kirekebishaji (isipokuwa U) inaunda ukanushaji wake.

Wahusika maalum

AnalogiMaelezo
() subpattern, kujieleza nested
kadi ya mwitu
(a,b) idadi ya matukio kutoka "a" hadi "b"
| mantiki "au", katika kesi ya matumizi mbadala ya herufi moja
\ kuepuka tabia maalum
. herufi yoyote isipokuwa mlisho wa mstari
\d tarakimu ya desimali
\D[^\d]herufi yoyote isipokuwa tarakimu ya desimali
\f mwisho (mwisho wa ukurasa)
\n tafsiri ya mstari
\PL herufi katika usimbuaji wa UTF-8 unapotumia kirekebishaji cha u
\r kurudi kwa gari
\s[\t\v\r\n\f]tabia ya nafasi
\S[^\s]ishara yoyote isipokuwa ile inayomulika
\t kujumlisha
\w nambari yoyote, herufi au kistari
\W[^\w]herufi yoyote isipokuwa nambari, herufi au kistari
\v kichupo cha wima

Wahusika maalum ndani ya darasa la wahusika

Nafasi ndani ya mstari

MfanoMawasilianoMaelezo
^ ^aa aa aaamwanzo wa mstari
$ $aaa a mwisho wa mstari
\A\Aaa aa aaa
aaa aaaa
mwanzo wa maandishi
\za\zaaa aaaa
aaa a
mwisho wa maandishi
\ba\b
\ba
aa a aa a
a aa a aa
mpaka wa neno, taarifa: mhusika aliyetangulia ni wa maneno, lakini anayefuata sio, au kinyume chake.
\B\Ba\Ba a a a ahakuna mpaka wa maneno
\G\Gaaaa aaaUtafutaji uliofanikiwa hapo awali, utaftaji ulisimamishwa katika nafasi ya 4 - ambapo a haikupatikana
Pakua katika PDF, PNG.

Nanga

Nanga katika maneno ya kawaida huonyesha mwanzo au mwisho wa kitu. Kwa mfano, mistari au maneno. Wanawakilishwa na alama fulani. Kwa mfano, muundo unaolingana na mfuatano unaoanza na nambari utaonekana kama hii:

Hapa herufi ^ inaashiria mwanzo wa mstari. Bila hivyo, mchoro ungelingana na mfuatano wowote ulio na tarakimu.

Madarasa ya wahusika

Madarasa ya wahusika katika usemi wa kawaida hulingana na seti fulani ya wahusika mara moja. Kwa mfano, \d inalingana na nambari yoyote kutoka 0 hadi 9 zikijumlishwa, \w inalingana na herufi na nambari, na \W inalingana na herufi zote isipokuwa herufi na nambari. Mchoro unaotambulisha herufi, nambari na nafasi inaonekana kama hii:

POSIX

POSIX ni nyongeza mpya kwa familia ya kawaida ya kujieleza. Wazo, kama ilivyo kwa madarasa ya wahusika, ni kutumia njia za mkato zinazowakilisha kundi fulani la wahusika.

Taarifa

Takriban kila mtu ana shida kuelewa uthibitisho mwanzoni, lakini unapozidi kuzifahamu, utajikuta unazitumia mara nyingi. Madai hutoa njia ya kusema, "Nataka kupata kila neno katika hati hii ambalo linajumuisha herufi "q" na halifuatiwi na "werty."

[^\s]*q(?!werty)[^\s]*

Nambari iliyo hapo juu huanza kwa kutafuta herufi zozote isipokuwa space ([^\s]*) ikifuatiwa na q . Kisha mchanganuzi anafikia dai la kutazama mbele. Hii hufanya kipengee kilichotangulia (wahusika, kikundi, au tabaka la wahusika) kiweke kiotomatiki masharti—italingana na mchoro ikiwa tu taarifa hiyo ni ya kweli. Kwa upande wetu, kauli ni hasi (?!), yaani, itakuwa kweli ikiwa kile kinachotafutwa ndani yake hakipatikani.

Kwa hivyo, mchanganuzi hukagua herufi chache zinazofuata dhidi ya muundo uliopendekezwa (werty). Ikiwa zinapatikana, basi taarifa hiyo ni ya uwongo, ambayo ina maana kwamba tabia q "itapuuzwa", yaani, haitafanana na muundo. Ikiwa werty haipatikani, basi taarifa hiyo ni kweli, na kila kitu kiko sawa na q. Kisha utafutaji unaendelea kwa herufi zozote isipokuwa nafasi ([^\s]*).

Vipima kiasi

Vipimo vya kupima hukuruhusu kufafanua sehemu ya muundo ambayo lazima irudiwe mara kadhaa mfululizo. Kwa mfano, ikiwa unataka kujua kama hati ina mfuatano wa herufi 10 hadi 20 (zinazojumuisha) "a", basi unaweza kutumia muundo huu:

A(10,20)

Kwa chaguo-msingi, quantifiers ni "choyo". Kwa hiyo, quantifier +, maana yake "mara moja au zaidi," itafanana na thamani ya juu iwezekanavyo. Wakati mwingine hii husababisha matatizo, katika hali ambayo unaweza kumwambia quantifier kuacha kuwa na tamaa (kuwa "mvivu") kwa kutumia modifier maalum. Angalia nambari hii:

".*"

Mchoro huu unalingana na maandishi yaliyoambatanishwa katika nukuu mbili. Walakini, mstari wako wa chanzo unaweza kuwa kitu kama hiki:

Salamu, Dunia

Kiolezo hapo juu kitapata kifungu kidogo kifuatacho kwenye mstari huu:

"helloworld.htm" title="Hujambo Ulimwengu" !}

Aligeuka kuwa mchoyo sana, akinyakua maandishi makubwa zaidi ambayo angeweza.

".*?"

Mchoro huu pia unalingana na herufi zozote zilizoambatanishwa katika nukuu mbili. Lakini toleo la uvivu (angalia kirekebishaji?) hutafuta tukio dogo kabisa, na kwa hivyo litapata kila safu ndogo iliyonukuliwa mara mbili kibinafsi:

"helloworld.htm" "Hujambo Ulimwengu"

Kutoroka kwa maneno ya kawaida

Semi za kawaida hutumia herufi fulani kuwakilisha sehemu tofauti za muundo. Walakini, shida itatokea ikiwa unahitaji kupata moja ya herufi hizi kwenye safu, kama herufi ya kawaida. Nukta, kwa mfano, katika usemi wa kawaida humaanisha "mhusika yeyote isipokuwa kukatika kwa mstari." Ikiwa unahitaji kupata nukta kwenye kamba, huwezi kutumia tu " . »kama kiolezo - hii itasababisha kupata karibu kila kitu. Kwa hivyo, unahitaji kumwambia mchanganuzi kwamba dot hii inapaswa kuchukuliwa kuwa dot ya kawaida na sio "tabia yoyote". Hii inafanywa kwa kutumia ishara ya kutoroka.

Herufi ya kutoroka inayotangulia mhusika kama vile kitone husababisha kichanganuzi kupuuza utendakazi wake na kuichukulia kama mhusika wa kawaida. Kuna herufi kadhaa ambazo zinahitaji kutoroka katika violezo na lugha nyingi. Unaweza kuzipata kwenye kona ya chini ya kulia ya karatasi ya kudanganya ("Alama za Meta").

Mchoro wa kupata uhakika ni:

\.

Vibambo vingine maalum katika misemo ya kawaida vinalingana na vipengele visivyo vya kawaida katika maandishi. Nafasi za kukatika kwa mistari na vichupo, kwa mfano, zinaweza kuandikwa kwenye kibodi lakini kuna uwezekano wa kuchanganya lugha za programu. Herufi ya kutoroka inatumika hapa kumwambia mchanganuzi amchukulie mhusika anayefuata kama mhusika maalum badala ya herufi au nambari ya kawaida.

Vibambo maalum vya kutoroka katika misemo ya kawaida

Ubadilishaji wa kamba

Uingizwaji wa kamba umeelezewa kwa undani katika aya inayofuata, "Vikundi na Masafa," lakini uwepo wa vikundi "vitu" unapaswa kutajwa hapa. Haya ni makundi ambayo yanapuuzwa wakati wa uingizwaji, ambayo ni muhimu sana ikiwa unataka kutumia hali ya "au" katika muundo, lakini hutaki kikundi hicho kushiriki katika ubadilishaji.

Vikundi na Masafa

Vikundi na safu ni muhimu sana. Labda ni rahisi kuanza na safu. Wanakuruhusu kutaja seti ya wahusika wanaofaa. Kwa mfano, ili kuangalia ikiwa mfuatano una tarakimu za heksadesimali (0 hadi 9 na A hadi F), unaweza kutumia masafa yafuatayo:

Ili kuangalia kinyume, tumia safu hasi, ambayo kwa upande wetu inafaa herufi yoyote isipokuwa nambari kutoka 0 hadi 9 na herufi kutoka A hadi F:

[^A-Fa-f0-9]

Vikundi hutumiwa mara nyingi wakati hali ya "au" inahitajika katika muundo; wakati unahitaji kutaja sehemu ya template kutoka sehemu nyingine yake; na pia wakati wa kubadilisha kamba.

Kutumia "au" ni rahisi sana: muundo ufuatao unatafuta "ab" au "bc":

Ikiwa katika usemi wa kawaida ni muhimu kurejelea moja ya vikundi vilivyotangulia, unapaswa kutumia \n , ambapo badala ya n badala ya nambari ya kikundi unachotaka. Unaweza kutaka muundo unaolingana na herufi "aaa" au "bbb" ikifuatiwa na nambari na kisha herufi tatu zilezile. Utaratibu huu unatekelezwa kwa kutumia vikundi:

(aaa|bbb)+\1

Sehemu ya kwanza ya muundo hutafuta "aaa" au "bbb", ikichanganya herufi zinazopatikana katika kikundi. Hii inafuatwa na utafutaji wa tarakimu moja au zaidi (+), na hatimaye \1. Sehemu ya mwisho ya muundo inarejelea kikundi cha kwanza na inatafuta kitu kimoja. Inatafuta inayolingana na maandishi ambayo tayari yamepatikana na sehemu ya kwanza ya muundo, sio sawa nayo. Kwa hivyo "aaa123bbb" haitakidhi muundo ulio hapo juu kwani \1 itatafuta "aaa" baada ya nambari.

Mojawapo ya zana muhimu zaidi katika misemo ya kawaida ni ubadilishaji wa kamba. Unapobadilisha maandishi, unaweza kurejelea kikundi kilichopatikana kwa kutumia $n . Hebu tuseme unataka kuangazia maneno yote "tamani" katika maandishi kwa herufi nzito. Ili kufanya hivyo, unapaswa kutumia kazi ya kubadilisha usemi wa kawaida, ambayo inaweza kuonekana kama hii:

Badilisha (muundo, uingizwaji, mada)

Kigezo cha kwanza kitakuwa kitu kama hiki (unaweza kuhitaji herufi chache za ziada kwa kazi hii):

([^A-Za-z0-9])(wish)([^A-Za-z0-9])

Itapata utokeaji wowote wa neno "wish" pamoja na herufi zilizotangulia na zinazofuata, mradi tu sio herufi au nambari. Kisha uingizwaji wako unaweza kuwa kama hii:

$1$2$3

Itachukua nafasi ya kamba nzima inayopatikana kwa kutumia muundo. Tunaanza kubadilisha na herufi ya kwanza kupatikana (hiyo si herufi au nambari), tukiweka alama $1 . Bila hii, tungeondoa herufi hii kutoka kwa maandishi. Vile vile huenda kwa mwisho wa uingizwaji ($ 3). Katikati tumeongeza lebo ya HTML kwa herufi nzito (bila shaka, unaweza kutumia CSS au ), akiwagawia kundi la pili lililopatikana kwa kutumia kiolezo ($2).

Virekebisha violezo

Virekebisha violezo vinatumika katika lugha kadhaa, haswa Perl. Wanakuruhusu kubadilisha jinsi kichanganuzi kinavyofanya kazi. Kwa mfano, kirekebishaji cha i husababisha kichanganuzi kupuuza kesi.

Maneno ya kawaida katika Perl yamezungukwa na mhusika sawa mwanzoni na mwishoni. Hii inaweza kuwa tabia yoyote (mara nyingi "/" hutumiwa), na inaonekana kama hii:

/muundo/

Marekebisho yanaongezwa hadi mwisho wa mstari huu, kama hii:

/muundo/i

Wahusika wa Meta

Hatimaye, sehemu ya mwisho ya jedwali ina herufi za meta. Hawa ni wahusika ambao wana maana maalum katika misemo ya kawaida. Kwa hivyo ikiwa unataka kutumia mmoja wao kama mhusika wa kawaida, basi inahitaji kuepukwa. Ili kuangalia uwepo wa mabano kwenye maandishi, tumia muundo ufuatao:

Laha ya kudanganya ni mwongozo wa jumla wa mifumo ya kawaida ya kujieleza bila kuzingatia maalum ya lugha yoyote. Inawasilishwa kwa namna ya meza ambayo inafaa kwenye karatasi moja iliyochapishwa ya ukubwa wa A4. Imeundwa chini ya leseni ya Creative Commons kulingana na laha ya kudanganya iliyoandikwa na Dave Child. Pakua katika PDF, PNG.


JavaScript regexp ni aina ya kitu ambacho hutumika kulinganisha mfuatano wa wahusika katika mifuatano.

Kuunda usemi wa kwanza wa kawaida

Kuna njia mbili za kuunda usemi wa kawaida: kutumia usemi wa kawaida halisi au kutumia kijenzi cha kawaida cha usemi. Kila moja yao inawakilisha muundo sawa: ishara " c", Ikifuatiwa na " a"na kisha ishara" t».

// usemi wa kawaida halisi umefungwa katika mikwaju (/) var chaguo1 = /paka/; // Mjenzi wa kujieleza mara kwa mara var chaguo2 = RegExp mpya("paka");

Kama kanuni ya jumla, ikiwa usemi wa kawaida utakuwa thabiti, ikimaanisha kuwa hautabadilika, ni bora kutumia usemi wa kawaida halisi. Ikiwa itabadilika au inategemea vigezo vingine, ni bora kutumia njia na mjenzi.

Mbinu ya RegExp.prototype.test().

Unakumbuka niliposema kuwa misemo ya kawaida ni vitu? Hii inamaanisha kuwa wana njia kadhaa. Njia rahisi ni JavaScript mtihani wa regexp ambayo inarudisha thamani ya boolean:

Kweli: Mfuatano una mchoro wa kawaida wa kujieleza.

Si kweli: Hakuna inayolingana iliyopatikana.

console.log(/cat/.test("paka anasema meow")); // true console.log(/cat/.test("mbwa anasema gome")); // si sahihi

Karatasi ya Kudanganya ya Misingi ya Kujieleza ya Kawaida

Siri ya maneno ya kawaida ni kukumbuka wahusika wa kawaida na vikundi. Ninapendekeza sana kutumia masaa machache kwenye chati iliyo hapa chini na kisha kurudi na kusoma zaidi.

Alama

  • . - (nukta) inalingana na herufi yoyote isipokuwa sehemu za kukatika kwa mstari;
  • *  –  inalingana na usemi uliopita, unaorudiwa mara 0 au zaidi;
  • +  –  inalingana na usemi uliopita ambao unarudiwa mara 1 au zaidi;
  • ? -  usemi uliopita ni hiari ( inalingana mara 0 au 1);
  • ^ - inalingana na mwanzo wa mstari;
  • $ - inalingana na mwisho wa mstari.

Vikundi vya wahusika

  • d- inalingana na herufi yoyote ya nambari.
  • w- inalingana na mhusika yeyote (nambari, herufi au kistari).
  • [XYZ]- seti ya wahusika. Inalingana na herufi yoyote kutoka kwa seti iliyobainishwa kwenye mabano. Unaweza pia kutaja safu za wahusika, kwa mfano, .
  • [XYZ ]+- inalingana na mhusika kutoka kwa seti inayorudiwa mara moja au zaidi.
  • [^A—Z]- ndani ya seti ya herufi, “^” inatumika kama ishara ya kukanusha. Katika mfano huu, muundo unalingana na kitu chochote ambacho sio herufi kubwa.

Bendera:

Kuna bendera tano za hiari katika JavaScript regexp. Wanaweza kutumika tofauti au pamoja, na huwekwa baada ya kufyeka kufunga. Kwa mfano: /[ A —Z ]/g. Hapa nitaonyesha bendera mbili tu.

g- utafutaji wa kimataifa.

i- utafutaji usiojali kesi.

Miundo ya ziada

(x)-  kunasa mabano. Usemi huu unalingana na x na unakumbuka hiyo mechi ili uweze kuutumia baadaye.

(?:x)- mabano yasiyokamata. Usemi huo unalingana na x lakini haukumbuki inayolingana.

Inalingana na x ikiwa tu itafuatiwa na y.

Hebu tujaribu nyenzo ambazo tumejifunza

Kwanza, hebu tujaribu yote yaliyo hapo juu. Wacha tuseme tunataka kuangalia kamba kwa nambari zozote. Kwa kufanya hivyo, unaweza kutumia ujenzi "d".

console.log(/d/.test("12-34")); // haki

Nambari iliyo hapo juu inarudi kuwa kweli ikiwa kuna angalau tarakimu moja kwenye mfuatano. Nini cha kufanya ikiwa unahitaji kuangalia kamba kwa kufuata umbizo? Unaweza kutumia herufi nyingi "d" kufafanua umbizo:

console.log(/dd-dd/.test("12-34")); //true console.log(/dd-dd/.test("1234")); // si sahihi

Ikiwa haujali jinsi nambari zinavyokuja kabla na baada ya "-" kuingia katika JavaScript regexp mtandaoni, unaweza kutumia alama ya "+" kuonyesha kwamba muundo wa "d" hutokea mara moja au zaidi:

console.log(/d+-d+/.test("12-34")); // kweli console.log(/d+-d+/.test("1-234")); // kweli console.log(/d+-d+/.test("-34")); // si sahihi

Kwa urahisi, unaweza kutumia mabano kuweka misemo ya kikundi. Wacha tuseme tuna paka na tunataka kuangalia muundo " mwao"(mkuu):

console.log(/me+(ow)+w/.test("meeeeowowoww")); // haki

Sasa hebu tufikirie.

m => linganisha herufi moja ‘m’;

e + => linganisha herufi "e" mara moja au zaidi;

(ow) + => linganisha herufi "ow" mara moja au zaidi;

w => inalingana na herufi ‘w’;

‘m’ + ‘eeee’ + ‘owowow’ + ‘w’.

Wakati waendeshaji kama "+" hutumiwa mara tu baada ya mabano, huathiri yaliyomo yote ya mabano.

Opereta "? " Inaonyesha kuwa herufi iliyotangulia ni ya hiari. Kama utakavyoona hapa chini, visa vyote viwili vya majaribio hurudi kuwa kweli kwa sababu vibambo vya "s" vimetiwa alama kuwa ni vya hiari.

console.log(/paka? says?/i.test("Paka anasema meow")); //true console.log(/paka? says?/i.test("Paka wanasema meow")); //haki

Ikiwa unataka kupata herufi ya kufyeka, unahitaji kuikwepa kwa kutumia mkato. Ndivyo ilivyo kwa wahusika wengine ambao wana maana maalum, kama vile alama ya kuuliza. Hapa kuna mfano wa regexp wa JavaScript wa jinsi ya kuzitafuta:

var slashSearch = ///; var questionSearch = /?/;

  • d ni sawa na : kila ujenzi unalingana na ishara ya dijiti.
  • w- hii ni sawa na [ A -Za -z 0-9_]: Semi zote mbili zinalingana na herufi yoyote ya alphanumeric au kistari.

Mfano: Kuongeza Nafasi kwa Kamba za Ngamia

Katika mfano huu, tumechoka sana na mtindo wa uandishi wa ngamia na tunahitaji njia ya kuongeza nafasi kati ya maneno. Hapa kuna mfano:

removeCc("camelCase") // => inapaswa kurudisha "kesi ya ngamia"

Kuna suluhisho rahisi kwa kutumia usemi wa kawaida. Kwanza, tunahitaji kupata herufi kubwa zote. Hii inaweza kufanywa kwa kutumia utaftaji wa mhusika na kirekebishaji cha kimataifa.

Hii inalingana na herufi "C" katika "camelCase"

Sasa, jinsi ya kuongeza nafasi kabla ya "C"?

Tunahitaji kutumia mabano ya kuvutia! Wanakuruhusu kupata mechi na ukumbuke kuitumia baadaye! Tumia mabano ya kukamata kukumbuka herufi kubwa unayopata:

Unaweza kufikia thamani iliyonaswa baadaye kama hii:

Hapo juu tunatumia $1 kufikia thamani iliyonaswa. Kwa njia, ikiwa tungekuwa na seti mbili za kunasa mabano, tungetumia $1 na $2 kurejelea thamani zilizonaswa, na vile vile kwa kunasa mabano zaidi.

Iwapo unahitaji kutumia mabano lakini huhitaji kunasa thamani hiyo, unaweza kutumia mabano yasiyonasa: (?: x ). Katika kesi hii, mechi ya x inapatikana, lakini haikumbukwa.

Hebu turudi kwenye kazi ya sasa. Je, tunatekeleza vipi kunasa mabano? Kwa kutumia njia ya kubadilisha JavaScript regexp! Tunapitisha "$1" kama hoja ya pili. Ni muhimu kutumia alama za nukuu hapa.

kazi removeCc(str)( return str.replace(/()/g, "$1"); )

Hebu tuangalie kanuni tena. Tunanyakua herufi kubwa na kisha kuibadilisha na herufi sawa. Ndani ya nukuu, weka nafasi ikifuatiwa na tofauti $1 . Matokeo yake, tunapata nafasi baada ya kila herufi kubwa.

kazi removeCc(str)( return str.replace(/()/g, " $1"); ) removeCc("camelCase") // "camel Case" removeCc("helloWorldItIsMe") // "hello World It Is Me"

Mfano: kuondoa herufi kubwa

Sasa tuna kamba na rundo la herufi kubwa zisizo za lazima. Umefikiria jinsi ya kuwaondoa? Kwanza, tunahitaji kuchagua herufi kubwa zote. Kisha tunatafuta seti ya herufi kwa kutumia kirekebishaji cha kimataifa:

Tutatumia njia ya kubadilisha tena, lakini tunafanyaje herufi ndogo wakati huu?

kazi lowerCase(str)( return str.replace(//g, ???); )

Kidokezo: Katika njia ya replace(), unaweza kutaja kazi kama parameta ya pili.

Tutatumia chaguo za kukokotoa za mshale ili kuepuka kunasa thamani ya mechi iliyopatikana. Unapotumia chaguo za kukokotoa katika mbinu ya kubadilisha ya JavaScript regexp, chaguo la kukokotoa litaitwa baada ya mechi kupatikana, na matokeo ya chaguo za kukokotoa hutumika kama mfuatano wa kubadilisha. Bora zaidi, ikiwa mechi ni ya kimataifa na mechi nyingi zinapatikana, kazi itaitwa kwa kila mechi inayopatikana.

kazi lowerCase(str)( return str.replace(//g, (u) => u.toLowerCase()); ) lowerCase("camel Case") // "kesi ya ngamia" lowerCase("hello World It Is Me" ) // "hello dunia ni mimi"

The RegExp mjenzi huunda kitu cha kujieleza cha kawaida kwa kulinganisha maandishi na muundo.

Kwa utangulizi wa maneno ya kawaida, soma Sura ya Maonyesho ya Kawaida ndani ya Mwongozo wa JavaScript.

Chanzo cha mfano huu wa mwingiliano huhifadhiwa kwenye hazina ya GitHub. Iwapo ungependa kuchangia mradi wa mifano shirikishi, tafadhali unganisha https://github.com/mdn/interactive-examples na ututumie ombi la kuvuta.

Sintaksia

Maandishi halisi, kijenzi na kiwanda yanawezekana:

/ muundo / bendera mpya RegExp(muundo [, bendera ]) RegExp(muundo [, bendera ])

Vigezo

muundo Nakala ya usemi wa kawaida; au kufikia ES5, kitu kingine cha RegExp au halisi (kwa nukuu mbili za wajenzi wa RegExp pekee). Sampuli zinaweza kujumuisha ili ziweze kulingana na anuwai pana ya thamani kuliko mfuatano halisi. bendera

Ikibainishwa, bendera ni mfuatano ambao una bendera za kuongeza; au ikiwa kipengee kimetolewa kwa muundo huo, mfuatano wa bendera utachukua nafasi ya bendera zozote za kitu hicho (na lastIndex itawekwa upya kuwa 0) (kuanzia ES2015). Ikiwa bendera hazijabainishwa na kipengee cha misemo cha kawaida kitatolewa, bendera za kitu hicho (na thamani ya lastIndex) zitanakiliwa tena.

bendera zinaweza kuwa na mchanganyiko wowote wa herufi zifuatazo:

G mechi ya kimataifa; tafuta mechi zote badala ya kusimama baada ya mechi ya kwanza. napuuza kesi; ikiwa bendera ya u pia imewezeshwa, tumia kukunja kwa kipochi cha Unicode. m multiline; chukulia herufi za mwanzo na mwisho (^ na $) kama zinafanya kazi kwenye mistari mingi (yaani, linganisha mwanzo au mwisho wa kila mmoja mstari (uliotenganishwa na \n au \r), sio tu mwanzo au mwisho wa mfuatano wote wa ingizo). s "dotAll"; inaruhusu. ili kuendana na mistari mpya. u Unicode; shughulikia muundo kama mlolongo wa alama za nambari za Unicode. (Angalia pia Kamba za binary) y nata; inalingana pekee kutoka kwa faharasa iliyoonyeshwa na sifa ya lastIndex ya usemi huu wa kawaida katika mfuatano lengwa (na haijaribu kulingana na faharasa zozote za baadaye).

Maelezo

Kuna njia mbili za kuunda kitu cha RegExp: a nukuu halisi na a mjenzi.

  • Nukuu halisi". vigezo vimefungwa kati ya kufyeka na usitumie alama za nukuu.
  • Kazi ya mjenzi". vigezo hazijafungwa kati ya kufyeka, lakini tumia alama za nukuu.

Semi zifuatazo huunda usemi sawa wa kawaida:

/ab+c/i RegExp mpya(/ab+c/, "i") // nukuu halisi RegExp mpya("ab+c", "i") // mjenzi

Nukuu halisi hutoa mkusanyiko wa usemi wa kawaida wakati usemi huo unatathminiwa. Tumia nukuu halisi wakati usemi wa kawaida utabaki bila kubadilika. Kwa mfano, ikiwa unatumia nukuu halisi kuunda usemi wa kawaida unaotumika katika kitanzi, usemi wa kawaida hautakusanywa tena kwa kila marudio.

Mjenzi wa kitu cha kawaida cha kujieleza, kwa mfano, new RegExp("ab+c") , hutoa mkusanyiko wa wakati wa utekelezaji wa usemi wa kawaida. Tumia chaguo za kukokotoa za kijenzi wakati unajua muundo wa usemi wa kawaida utakuwa ukibadilika, au hujui mchoro na unaupata kutoka chanzo kingine, kama vile ingizo la mtumiaji.

Kuanzia na ECMAScript 6, RegExp(/ab+c/, "i") mpya haitupi tena TypeError("haiwezi kusambaza bendera wakati wa kuunda RegExp moja kutoka nyingine") wakati hoja ya kwanza ni RegExp na hoja ya pili ya alama iko. RegExp mpya kutoka kwa hoja huundwa badala yake.

Wakati wa kutumia kazi ya mjenzi, sheria za kawaida za kutoroka kwa kamba (zinazotangulia herufi maalum na \ zinapojumuishwa kwenye kamba) ni muhimu. Kwa mfano, zifuatazo ni sawa:

Acha re = /\w+/ let re = new RegExp("\\w+")

Mali

RegExp.mfano Inaruhusu uongezaji wa sifa kwa vitu vyote. RegExp.length Thamani ya RegExp.length ni 2 . pata RegExp[@@species] Kazi ya mjenzi ambayo hutumiwa kuunda vitu vinavyotokana. RegExp.lastIndex Faharasa ya kuanza mechi inayofuata.

Mbinu

Kipengee cha kimataifa cha RegExp hakina mbinu zake. Walakini, hairithi njia zingine kupitia mnyororo wa mfano.

Vipengee na mifano ya RegExp

Mali

Mifano

Kutumia usemi wa kawaida kubadilisha umbizo la data

let str = "#foo#" let regex = /foo/y regex.lastIndex = 1 regex.test(str) // true regex.lastIndex = 5 regex.test(str) // uongo (lastIndex inazingatiwa na bendera nata) regex.lastIndex // 0 (weka upya baada ya kushindwa kwa mechi)

Usemi wa kawaida na herufi za Unicode

Kama ilivyotajwa hapo juu, \w au \W inalingana na herufi za ASCII tu; kwa mfano, a hadi z , A hadi Z , 0 hadi 9 , na _ .

Ili kulinganisha herufi kutoka lugha zingine kama vile Kisirili au Kiebrania, tumia \u mhhh, wapi mhhh ni thamani ya Unicode ya mhusika katika hexadecimal. Mfano huu unaonyesha jinsi mtu anavyoweza kutenganisha herufi za Unicode kutoka kwa neno.

Acha maandishi = "Sampuli ya maandishi kwa Kirusi" let regex = /[\u0400-\u04FF]+/g let match = regex.exec(text) console.log(match) // logs "Sample" console.log(regex . lastIndex) // kumbukumbu "7" let match2 = regex.exec(text) console.log(match2) // logs "on" console.log(regex.lastIndex) // kumbukumbu "15" // na kadhalika

Inachomoa jina la kikoa kidogo kutoka kwa URL

let url = "http://xxx.domain.com" console.log(/[^.]+/.exec(url).substr(7)) // kumbukumbu "xxx"

Vipimo

Vipimo Hali Maoni
Toleo la 3 la ECMAScript (ECMA-262) Kawaida Ufafanuzi wa awali. Inatekelezwa katika JavaScript 1.1.
ECMAScript 5.1 (ECMA-262)
Kawaida
ECMAScript 2015 (Toleo la 6, ECMA-262)
Ufafanuzi wa "RegExp" katika maelezo hayo.
Kawaida Kijenzi cha RegExp hakitupi tena wakati hoja ya kwanza ni RegExp na hoja ya pili iko. Inatanguliza Unicode na bendera nata.
Rasimu ya Hivi Punde ya ECMAScript (ECMA-262)
Ufafanuzi wa "RegExp" katika maelezo hayo.
Rasimu

Utangamano wa kivinjari

Jedwali la uoanifu kwenye ukurasa huu limetolewa kutoka kwa data iliyopangwa. Iwapo ungependa kuchangia data, tafadhali angalia https://github.com/mdn/browser-compat-data na ututumie ombi la kuvuta.