JavaRush /Java блогы /Random-KK /RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 4-...
Artur
Деңгей
Tallinn

RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 4-бөлім

Топта жарияланған
RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 1-бөлім RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам. 2-бөлім Тұрақты сөз тіркестерін меңгеруге арналған 20 қысқа қадам. 3-бөлім Бұл соңғы бөлім, ортада, негізінен тұрақты тіркес шеберлері қолданатын нәрселерді қозғайды. Бірақ алдыңғы бөліктердегі материал сізге оңай болды, солай ма? Бұл сіз бұл материалды бірдей оңай өңдей аласыз дегенді білдіреді! Түпнұсқа мұнда RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  4 - 1 бөлім <h2>16-қадам: түсірусіз топтар (?:)</h2> RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  4 - 2 бөлімАлдыңғы қадамдағы екі мысалда біз шынымен қажет емес мәтінді түсірдік. Файл өлшемдері тапсырмасында біз файл өлшемдерінің бірінші санының алдындағы бос орындарды, ал CSV тапсырмасында әрбір таңбалауыштың арасындағы үтірлерді түсірдік. Бізге бұл таңбаларды түсірудің қажеті жоқ, бірақ біз оларды тұрақты өрнекті құрылымдау үшін пайдалануымыз керек. Бұл топты түсірмей пайдаланудың тамаша нұсқалары (?:). Түсірмейтін топ дәл солай естіледі - ол таңбаларды топтастыруға және тұрақты өрнектерде пайдалануға мүмкіндік береді, бірақ оларды нөмірленген топта түсірмейді:
үлгі: (?:")([^"]+)(?:") 
жол: Мен тек "осы тырнақшалардың ішіндегі мәтінді" алғым келеді .
сәйкестіктер:             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Топ:                 111111111111111111111111111    
( Мысал ) Тұрақты өрнек енді тырнақшаға алынған мәтінге және тырнақша таңбаларының өздеріне сәйкес келеді, бірақ түсіру тобы тек тырнақшаға алынған мәтінді түсірді. Неліктен мұны істеуіміз керек? Мәселе мынада, тұрақты өрнек механизмдерінің көпшілігі тұрақты өрнектеріңізде анықталған түсіру топтарынан мәтінді қалпына келтіруге мүмкіндік береді. Егер бізге қажет емес қосымша таңбаларды түсіру топтарымызға қоспай қиып алсақ, бұл мәтінді кейінірек талдауды және өңдеуді жеңілдетеді. CSV талдаушысын алдыңғы қадамнан қалай тазалау керек:
үлгі: (?:^|,)\s*(?:\"([^",]*)\"|([^», ]*)) 
жол:   a , " b ", " cd ", e , f , " gh ", dfgi ,, k , "", l 
сәйкес келеді: ^ ^ ^^^ ^ ^ ^^^ ^^^^ ^ ^ 
топ:    2 1 111 2 2 111 2222 2 2    
( Мысал(^|,) ) Мұнда <mark>байқау керек бірнеше нәрсе бар:</mark> Біріншіден, түсіру тобын түсірмейтін топқа өзгерткендіктен, біз енді үтірлерді түсірмейміз (?:^|,). Екіншіден, біз түсіру тобын түсірмейтін топтың ішіне орналастырдық. Бұл, мысалы, белгілі бір ретпен пайда болу үшін таңбалар тобы қажет болғанда пайдалы, бірақ сіз тек сол таңбалардың ішкі жиынына мән бересіз. Біздің жағдайда тырнақшаның ішінде пайда болуы үшін бізге тырнақшасыз таңбалар мен үтірлер қажет болды , бірақ іс[^",]* жүзінде тырнақша таңбаларының өздері қажет емес, сондықтан оларды түсірудің қажеті жоқ еді . Соңында, жоғарыдағы мысалда kжәне таңбалары арасында нөлдік ұзындық сәйкестік бар екенін <mark>ескерту</mark> l. Тырнақшалар ""ізделетін ішкі жол болып табылады, бірақ тырнақшалардың арасында таңбалар жоқ, сондықтан сәйкес ішкі жолда таңбалар жоқ (ұзындығы нөл). <h3>Білімімізді бекітеміз бе? Мұнда бізге екі жарым тапсырма көмектесетін болады:</h3> Түсіруге жатпайтын топтарды (және түсіру топтарын және таңбалар сыныптарын және т.б.) пайдаланып, жолда тек дұрыс пішімделген файл өлшемдерін түсіретін тұрақты өрнекті жазыңыз. төменде:
үлгі:
жол:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
сәйкестіктер: ^^^^^ ^^^^^ ^^^^^^ ^^^^ 
топ:    11111 1111 11111 111    
( Шешім ) HTML ашу тегтері келесімен басталады <және аяқталады >. HTML жабу тегтері таңбалар тізбегінен басталып </таңбамен аяқталады >. Tag атауы осы таңбалардың арасында орналасқан. Келесі тегтердегі атауларды ғана түсіру үшін тұрақты өрнек жаза аласыз ба? (Бұл мәселені түсірмейтін топтарды қолданбай шешуге болады. Осы екі жолмен шешіп көріңіз! Бір рет топтармен және бір ретсіз.)
үлгі:
жол:   <p> </span> <div> </kbd> <link> 
сәйкес келеді: ^^^ ^^^^^^ ^^^^^ ^^^^^^ ^^^^^^ 
топ:    1 1111 111 111 1111    
( Түсірусіз топтарды пайдаланатын шешім ) ( Түсірусіз топтарды пайдаланбай шешім ) <h2>17-қадам: Кері сілтемелер \Nжәне атаулы түсіру топтары</h2> RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  4 - 3 бөлімМен сізге кіріспеде әдетте қалыпты өрнектерді пайдаланып HTML талдаушысын жасауға тырысатынын ескерткенмін. жүректің ауыруына әкеледі, бұл соңғы мысал көптеген тұрақты тіркестердің басқа (кейде) пайдалы мүмкіндігіне жақсы нұсқа болып табылады: кері сілтемелер. Кері сілтемелер бір мәтінді екі рет түсіріп көруге болатын қайталанатын топтарға ұқсайды. Бірақ олар бір маңызды аспектіде ерекшеленеді - олар тек бір мәтінді, кейіпкерді сипаттайды. Қайталанатын топ бізге келесідей нәрсені түсіруге мүмкіндік береді:
үлгі: (he(?:[az])+) 
string:   heyabcdefg эй хейо heyellow эйййййййййй 
сәйкес келеді: ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ ^^^^^^^^ 
топ:    1111111111 111 1111 11111111 11111111111    
( Мысал ) ...онда кері сілтеме тек мынаған сәйкес келеді:
үлгі: (he([az])(\2+)) 
жол: heyabcdefg эй хейо heyellow эййййййййй 
сәйкес келеді:                              ^^^^^^^^^^^ 
топ:                                 11233333333    
( Мысал ) Қайталанатын түсіру топтары бір үлгіні қайта-қайта сәйкестендіру қажет болғанда пайдалы, ал кері сілтемелер бір мәтінді сәйкестендіру үшін жақсы. Мысалы, сәйкес ашылатын және жабылатын HTML тегтерін табуға тырысу үшін кері сілтемені пайдалана аламыз:
үлгі: <(\w+)[^>]*>[^<]+<\/\1> 
жол:   <span style="color: red">эй</span> 
сәйкес келеді: ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Топ:    1111    
( Мысал ) Бұл өте жеңілдетілген мысал екенін <mark>Назар аударыңыз</mark> және мен сізге тұрақты өрнек негізіндегі HTML талдаушысын жазуға тырыспауды қатты ұсынамын. Бұл өте күрделі синтаксис және сізді ауыртып жіберуі мүмкін. Атаулы түсіру топтары кері сілтемелерге өте ұқсас, сондықтан мен оларды осы жерде қысқаша қарастырамын. Кері сілтемелер мен атаулы түсіру тобының арасындағы жалғыз айырмашылық мынада:... аталған түсіру тобының аты бар:
үлгі: <(?<tag>\w+)[^>]*>[^<]+<\/(?P=tag)></tag> 
жол:   <span style="color: red">эй< /span> 
сәйкестіктері: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
Топ:    1111    
( Мысал ) (?<name>...) немесе (?'name'...) синтаксисін (.NET-үйлесімді тұрақты өрнек) немесе осы синтаксиспен (?P<name>) пайдаланып атаулы түсіру тобын жасауға болады. ..) немесе (?P'name'...) (Python-үйлесімді тұрақты өрнек). Біз екі нұсқаны қолдайтын PCRE (Perl Compatible Regular Expression) қолданып жатқандықтан, біреуін де осы жерде пайдалана аламыз. (Java 7 .NET синтаксисін көшірді, бірақ тек қана бұрыштық жақшалар нұсқасы. Аудармашының ескертпесі) Аталған түсіру тобын кейінірек қалыпты өрнекте қайталау үшін \<kname> немесе \k'name' (.NET) немесе (? P= аты) (Python). Тағы да, PCRE осы әртүрлі опциялардың барлығын қолдайды. Атаулы түсіру топтары туралы толығырақ осы жерден оқи аласыз , бірақ бұл олар туралы шынымен білуіңіз керек нәрселердің көпшілігі болды. <h3>Бізге көмектесетін тапсырма:</h3> Бұл адамның атын есте сақтау үшін кері сілтемелерді пайдаланыңыз... ммм....
үлгі:
string: "Сәлем, менің атым Джо." [кейінірек] "Бұл жігіттің аты кім? Джо ?"
сәйкестіктер:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ 
топ:                  111    
( Шешім ) <h2>18-қадам: алға және артқа қарау</h2> RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  4 - 4 бөлімЕнді біз тұрақты тіркестердің кейбір қосымша мүмкіндіктеріне тоқталамыз. Мен 16-қадамға дейін барлығын жиі қолданамын. Бірақ бұл соңғы бірнеше қадамдар өте күрделі өрнектерді сәйкестендіру үшін регексті өте байсалды қолданатын адамдарға ғана арналған. Басқаша айтқанда, тұрақты тіркестердің шеберлері. «Алға қарау» және «артқа қарау» өте күрделі болып көрінуі мүмкін, бірақ олар өте күрделі емес. Олар сізге бұрын түсірілмейтін топтармен жасаған ісімізге ұқсас нәрсені жасауға мүмкіндік береді - сәйкестендіру қажет нақты мәтіннің алдында немесе одан кейін бірден мәтіннің бар-жоғын тексеріңіз. Мысалы, біз адамдарға ұнайтын заттардың атауларын ғана сәйкестендіруді қалаймыз делік, бірақ олар бұған ынталы болса ғана (тек олар сөйлемді леп белгісімен аяқтаса). Біз келесідей нәрсені жасай аламыз:
үлгі: (\w+)(?=!) 
жол: Маған үстел ұнайды. Мен степлерді бағалаймын. Мен шамды жақсы көремін !
матчтар:                                           ^^^^ 
топ:                                              1111    
( Мысал(\w+) ) Сіз әдетте үзіндідегі кез келген сөздерге сәйкес келетін жоғарыдағы түсіру тобының шам сөзіне қалай сәйкес келетінін көре аласыз . Позитивті көзқарас (?=!)дегеніміз, біз тек аяқталатын тізбектерді сәйкестендіре аламыз !, бірақ біз леп белгісінің өзіне сәйкес келмейтінімізді білдіреді. Бұл маңызды айырмашылық, өйткені түсірмейтін топтарда біз кейіпкерге сәйкес келеміз, бірақ оны түсірмейміз. Алдыңғы және арттың көрінісі арқылы біз тұрақты өрнекті құрастыру үшін таңбаны пайдаланамыз, бірақ содан кейін біз оны өзіне қарсы сәйкестендірмейміз. Біз оны кейінірек тұрақты өрнекте сәйкестендіре аламыз. Алды мен артқа қараудың төрт түрі бар: оң көзқарас (?=...), теріс көзқарас (?!...), оң көзқарас (?<=...) және теріс (?<!. ..) . Олар өздеріне ұқсайтын нәрсені жасайды - оң көзқарас пен артқа қарай қарау тұрақты өрнек механизміне тек алға/артқа қарауда қамтылған мәтін нақты сәйкес келгенде ғана сәйкестендіруді жалғастыруға мүмкіндік береді. Теріс қарау және артқа қарау керісінше жасайды - олар алға қарау/артқа қараудағы мәтін сәйкес келмегенде ғана регекс сәйкес келуіне мүмкіндік береді. Мысалы, біз әдіс атауларын олар жұмыс істейтін нысанға емес, тек әдіс реті тізбегіне сәйкестендіруді қалаймыз. Бұл жағдайда әрбір әдіс атауының алдында таңба болуы керек .. Қарапайым қайта қарауды пайдаланатын тұрақты өрнек мына жерде көмектесе алады:
үлгі: (?<=\.)(\w+) 
жол: myArray. flatMap.aggregate.summarise.print !
сәйкестіктер:         ^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^^ 
топ:            1111111 111111111 111111111 11111    
( Мысал ) Жоғарыдағы мәтінде сөз таңбаларының кез келген тізбегін сәйкестендіреміз \w+, бірақ олардың алдында таңба болса ғана .. Біз түсірмейтін топтардың көмегімен ұқсас нәрсеге қол жеткізе аламыз, бірақ нәтиже сәл күрделірек:
үлгі: (?:\.)(\w+) 
жол: myArray .flatMap.aggregate.summarise.print !
сәйкестіктер:        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
топ:            1111111 111111111 111111111 11111    
( Мысал ) Ол қысқарақ болса да, ол бізге қажет емес таңбаларға сәйкес келеді. Бұл мысал тривиальды болып көрінгенімен, алға қарау және артқа қарау тұрақты өрнектерді тазалауға шынымен көмектеседі. <h3>Фиреуге аз ғана қалды! Келесі 2 тапсырма бізді оған 1 қадам жақындатады:</h3> Теріс іздеу (?<!...) тұрақты өрнек механизміне теріс іздеу ішіндегі мәтін болмаса ғана сәйкестікті табу әрекетін жалғастыруға мүмкіндік береді. мәтіннің қалған бөлігіне дейін көрсетіледі, оған сәйкестікті табу керек. Мысалы, конференцияға қатысатын әйелдердің фамorяларын ғана сәйкестендіру үшін тұрақты өрнекті қолдануға болады. Ол үшін адамның фамorясының алдында таңба болмауын қадағалағымыз келеді Mr.. Бұл үшін тұрақты өрнек жаза аласыз ба? (Tagі кем дегенде төрт таңбадан тұрады деп болжауға болады.)
үлгі:
жол: мырза. Браун, ханым. Смит , ханым Джонс , Мисс Дейзи , Мистер. Жасыл
сәйкестіктер:                ^^^^^ ^^^^^ ^^^^^ 
топ:                   11111 11111 11111    
( Шешім ) Біз дерекқорды тазалап жатырмыз делік және бізде пайыздарды көрсететін ақпарат бағанасы бар. Өкінішке орай, кейбір адамдар сандарды [0,0, 1,0] диапазонында ондық мәндер ретінде жазды, ал басқалары [0,0%, 100,0%] диапазонында пайыздарды жазды, ал басқалары пайыздық мәндерді жазды, бірақ әріптік пайыз белгісін ұмытып кетті %. Теріс көзқарасты (?!...) пайдаланып, тек пайыздық болуы керек, бірақ сандары жоқ мәндерді белгілей аласыз ба %? Бұл мәндер 1,00-ден асатын мәндер болуы керек, бірақ соңынан қалмайды %. (Ешбір санда ондық үтірдің алдында немесе одан кейінгі екі цифрдан артық болуы мүмкін емес.) Бұл шешім өте қиын екенін <mark>ескерту</mark> . Егер сіз бұл мәселені менің жауабыма қарамай шеше алсаңыз, онда сізде тұрақты өрнектерде үлкен дағдыларыңыз бар!
үлгі:
жол: 0,32 100,00 5,6 0,27 98% 12,2% 1,01 0,99% 0,99 13,13 1,10 
сәйкестік:      ^^^^^^ ^^^ ^^^^ ^^^^^ ^^^^ 
топ:         111111 111 1111111111    
( Шешім ) <h2>19-қадам: Тұрақты өрнектердегі шарттар</h2> RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  4 - 5 бөлімБіз қазір адамдардың көпшілігі тұрақты тіркестерді пайдаланbyteын деңгейге жеттік. Біз қарапайым тұрақты өрнектерді пайдалану жағдайларының 95%-ын қарастырдық және 19 және 20-қадамдарда орындалғанның барлығы әдетте awk немесе sed (немесе жалпы мақсаттағы бағдарламалау тілі) сияқты толыққанды мәтінді өңдеу тілі арқылы орындалады. Яғни, тұрақты өрнектің шынымен не істей алатынын білу үшін әрі қарай жүрейік. Тұрақты өрнектер Turing толық болмаса да , кейбір тұрақты өрнек қозғалтқыштары толық бағдарламалау тіліне өте ұқсас мүмкіндіктерді ұсынады. Сондай ерекшеліктердің бірі – «жағдай». Regex шарттылары if-then-else операторларына мүмкіндік береді, мұнда таңдалған тармақ алдыңғы қадамда білген "алға қарау" немесе "артқа қарау" арқылы анықталады. Мысалы, күндер тізіміндегі жарамды жазбаларды ғана сәйкестендіру қажет болуы мүмкін:
үлгі: (?<=ақпан )([1-2][0-9])|(?<=наурыз )([1-2][0-9]|3[0-1]) 
жол: жұмыс істеген күндер : 28 ақпан , 29 ақпан , 30 ақпан, 30 наурыз , 31 наурыз  
матчтар:                   ^^ ^^ ^^ ^^ 
топ:                      11 11 22 22    
( Мысал ) Жоғарыдағы топтардың да айлар бойынша индекстелетінін <mark>ескерту</mark>. Біз барлық 12 айға тұрақты өрнек жаза аламыз және тек жарамды күндерді жаза аламыз, содан кейін олар жыл айы бойынша индекстелген топтарға біріктіріледі. Жоғарыда егер "ақпан" санның алдында болса (және екіншісі үшін де) бірінші топтағы сәйкестіктерді іздейтін if-like құрылымын пайдаланады. Бірақ біз тек ақпан айы үшін арнайы өңдеуді қолданғымыз келсе ше? «Егер санның алдында «ақпан» болса, мынаны орындаңыз, әйтпесе мынаны басқа әрекетті орындаңыз» сияқты нәрсе. Шарттылық мұны қалай жасайды:
үлгі: (?(?<=Ақпан )([1-2][0-9])|([1-2][0-9]|3[0-1])) 
жол: Жұмыс істеген күндері: 28 ақпан , 29 ақпан , 30 ақпан, 30 наурыз , 31 наурыз  
матчтар:                   ^^ ^^ ^^ ^^ 
топ:                      11 11 22 22    
( Мысал ) if-then-else құрылымы (?(If)then|else) сияқты көрінеді, мұндағы (if) "алға қарау" немесе "артқа қарау" арқылы ауыстырылады. Жоғарыдағы мысалда (егер) ретінде жазылады (?<=Feb). 29-дан жоғары күндерді сәйкестендіріп алғанымызды көре аласыз, бірақ олар "ақпанға" сәйкес келмеген жағдайда ғана. Шартты өрнектерде lookbehinds пайдалану, сәйкестіктің алдында қандай да бір мәтін болуын қамтамасыз ету қажет болса, пайдалы. Позитивті қарау шарты шатастыруы мүмкін, себебі шарттың өзі ешбір мәтінге сәйкес келмейді. Сондықтан if шартының мәні болғанын қаласаңыз, ол төмендегідей болашаққа қатысты болуы керек:
үлгі: (?(?=дәл)дәл|else)wo 
жол: дәл басқа дәл екі басқа  
сәйкестік:            ^^^^^^^ ^^^^^^
( Мысал ) Бұл оң болжамды шарттардың пайдасыз екенін білдіреді. Сіз сол мәтіннің алдында тұрғанын тексеріңіз, содан кейін ол кезде орындалатын сәйкес үлгіні қамтамасыз етіңіз. Шартты өрнек бізге мұнда мүлдем көмектеспейді. Сондай-ақ, жоғарыдағыны қарапайым тұрақты өрнекпен ауыстыруға болады:
үлгі: (?:дәл|else)wo 
жол: дәл басқа дәл екі басқа  
сәйкестік:            ^^^^^^^ ^^^^^^
( Мысал ) Сонымен, шартты өрнектерге арналған негізгі ереже: сынау, сынау және қайтадан сынау. Әйтпесе, сіз анық деп ойлаған шешімдер ең қызықты және күтпеген жолмен сәтсіздікке ұшырайды :) <h3>Міне, бізді соңғы, 20-шы қадамнан бөлетін тапсырмалардың соңғы блогына келдік:</h3> Тұрақты өрнекті жазыңыз. келесі сөздің бас әріптен басталатынын тексеру үшін теріс қарау шартты өрнегін пайдаланады. Олай болса, тек бір бас әріпті, содан кейін кіші әріптерді алыңыз. Олай болмаса, кез келген сөз таңбасын алыңыз.
үлгі:
string:   Jones Smith 9sfjn Hobbes 23r4tgr9h CSV Csv vVv 
сәйкестіктері: ^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^ 
топ:    22222 22222 11111 222222 111111111 222 111    
( Шешімowns ) Мәтіннің алдында мәтін болмаса cl, мәтінді oudsтек оның алдында мәтін болса ғана түсіретін шартты өрнектің артына теріс қарауды жазыңыз cl. (Біраз ойдан шығарылған мысал, бірақ сіз не істей аласыз ...)
үлгі:
string: Бұл сайқымазақтардың кейбір клоудары бар . уд.
сәйкес келеді:              ^^^^ ^^^^   
( Шешім ) <h2>20-қадам: Рекурсия және одан әрі зерттеу</h2> RegEx: тұрақты өрнектерді меңгеру үшін 20 қысқа қадам.  4-6 бөлімШындығында, кез келген тақырыпқа 20-қадамдық кіріспеде сығуға болатын көп нәрсе бар және тұрақты тіркестер де ерекшелік емес. Интернетте табуға болатын тұрақты өрнектерге арналған көптеген әртүрлі енгізулер мен стандарттар бар . Егер сіз көбірек білгіңіз келсе, мен сізге керемет RegisterExpressions.info сайтын қарауды ұсынамын , бұл тамаша анықтама және мен тұрақты тіркестер туралы көп нәрсені сол жерден үйрендім. Мен оны, сондай-ақ regex101.com сайтын өз туындыларыңызды сынау және жариялау үшін ұсынамын. Осы соңғы қадамда мен сізге тұрақты өрнектер туралы, атап айтқанда рекурсивті өрнектерді қалай жазу керектігі туралы көбірек білім беремін. Қарапайым рекурсиялар өте қарапайым, бірақ оның тұрақты өрнек контекстінде нені білдіретіні туралы ойланайық. Тұрақты өрнектегі қарапайым рекурсияның синтаксисі(?R)? былай жазылады: . Бірақ, әрине, бұл синтаксис өрнектің өзінде пайда болуы керек. Біз жасайтын нәрсе - өрнекті өз ішінде, ерікті санда. Мысалы:
үлгі: (эй(?R)?oh) 
string:   heyoh heyyoh heyheyohoh эй эй эййэй эй heyheyohoh  
сәйкестіктері: ^^^^^ ^^^^^^^^^^^^^^^^^^^^ 
топ:    11111 1111111111 1111111111    
( Мысал ) Кірістірілген өрнек міндетті емес болғандықтан ( (?R)артынан ?), ең қарапайым сәйкестік рекурсияны толығымен елемеу болып табылады. Сонымен, hey, содан кейін ohсәйкес келеді ( heyoh). Бұдан күрделірек өрнекті сәйкестендіру үшін, біз тізбекті енгізген өрнектің нүктесінде өз ішіне кірістірілген сәйкес ішкі жолды табуымыз керек (?R). Басқаша айтқанда, біз heyheyohoh немесе heyheyohohoh және т.б. Бұл кірістірілген өрнектер туралы керемет нәрселердің бірі, кері сілтемелер мен атаулы түсіру топтарынан айырмашылығы, олар сізді таңба бойынша бұрын сәйкестендірілген мәтінмен шектемейді. Мысалы:
үлгі: ([Hh][Ee][Yy](?R)?oh) 
жол:   heyoh heyyoh hEyHeYohoh эй эй эййе hEyHeYHEyohohoh  
сәйкес келеді: ^^^^^ ^^^^^^^^^^ ^^^^^ ^^^^^^^^^^ 
топ:    11111 1111111111 111111111111111    
( Мысал ) Тұрақты өрнек механизмі сіздің тұрақты өрнекті өзіне ерікті түрде бірнеше рет көшіріп, қоятынын елестете аласыз. Әрине, бұл кейде сіз күткен нәрсені орындамауы мүмкін дегенді білдіреді:
үлгі: ((?:\(\*)[^*)]*(?R)?(?:\*\))) 
жол: (* түсініктеме (* кірістірілген *) * емес)
сәйкестіктер:            ^^^^^^^^^^^^ 
топ:               111111111111    
( Мысал ) Неліктен бұл регекс сыртқы түсініктемені емес, тек кірістірілген түсініктемені түсіргенін айта аласыз ба? Бір нәрсе анық: күрделі тұрақты тіркестерді жазғанда, олардың сіз ойлағандай жұмыс істейтініне көз жеткізу үшін әрқашан оларды сынап көріңіз. Тұрақты сөз тіркестерінің жол бойындағы бұл жоғары жылдамдықтағы митинг аяқталды. Сізге бұл саяхат ұнады деп үміттенемін. Ақырында, мен осы жерден, басында уәде еткенімдей, материалды тереңірек зерттеу үшін бірнеше пайдалы сілтемелерді қалдырамын:
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION