Reguljära uttryck är ett formellt språk som används i datorprogram som arbetar med text för att söka efter och manipulera delsträngar i text , baserat på användningen av metatecken ( jokertecken ) . För att söka används en mönstersträng ( engelska mönster , på ryska kallas det ofta för "mall", "mask"), bestående av tecken och metatecken och sätter sökregeln. För manipulationer med text anges dessutom en ersättningssträng som även kan innehålla specialtecken.
Reguljära uttryck används av vissa textredigerare och verktyg för att söka och ersätta text. Med hjälp av reguljära uttryck kan du till exempel ange mönster som låter dig:
Med reguljära uttryck kan du också ange mycket mer komplexa sökningar eller ersätta mönster.
Resultatet av att arbeta med ett reguljärt uttryck kan vara:
Om ett reguljärt uttryck används för att ersätta text, så blir resultatet av arbetet en ny textsträng, som är källtexten, från vilken de hittade delsträngarna (matchade med mönstret) tas bort och ersättningssträngar ersätts (ev. modifierad av grupper av tecken som kommer ihåg under analysen från källtexten). Ett specialfall av textändring är borttagningen av alla förekomster av det hittade mönstret - för vilket ersättningssträngen anges tom.
Uppsättningen verktyg (inklusive sed- editorn och grep- filtret ) som levererades med UNIX- distributioner var bland de första som populariserade reguljära uttryck för ordbehandling. Många moderna programmeringsspråk har inbyggt stöd för reguljära uttryck. Bland dem finns ActionScript , Perl , Java [1] , PHP , JavaScript , .NET Framework- språk [2] , Python , Tcl , Ruby , Lua , Gambas , C++ ( 2011 standard ), Delphi , D , Haxe och andra.
Ursprunget till reguljära uttryck ligger i automatteorin , teorin om formella språk och Chomskys klassificering av formella grammatiker [3] .
Dessa fält studerar beräkningsmodeller (automater) och sätt att beskriva och klassificera formella språk . På 1940-talet Warren McCulloch och Walter Pitts beskrev ett neuralt system med en enkel automat som modell för en neuron .
Matematikern Stephen Kleene beskrev senare dessa mönster med sin matematiska notation som kallas " vanliga mängder ".
Ken Thompson byggde in dem i QED- redigeraren och sedan i UNIX -redigeraren . Sedan dess har reguljära uttryck blivit mycket använda i UNIX och UNIX-liknande verktyg som expr , awk , Emacs , vi , lex och Perl .
Reguljära uttryck i Perl och Tcl kommer från en implementering skriven av Henry Spencer . Philip Hazel utvecklade PCRE -biblioteket ( Perl -kompatibla reguljära uttryck ) , som används i många moderna verktyg som PHP och Apache .
Reguljära uttryck består av konstanter och operatorer som definierar uppsättningar av strängar respektive uppsättningar av operationer på dem. Följande konstanter definieras:
och följande operationer:
De reguljära uttryck som finns i moderna programmeringsspråk (särskilt PCRE ) har mer kraft än vad som kallas reguljära uttryck i formell språkteori; i synnerhet har de numrerade bakåtreferenser . Detta gör att de kan analysera strängar som inte bara beskrivs av vanliga grammatiker, utan också av mer komplexa, i synnerhet kontextfria grammatiker [5] [6] .
De flesta tecken i ett reguljärt uttryck representerar sig själva, med undantag för specialtecken [ ] \ / ^ $ . | ? * + ( ) { } (denna uppsättning skiljer sig för olika typer av reguljära uttryck, se Varieties of regular expressions ), som kan escapes med ett tecken \(omvänt snedstreck) för att representera sig själva som texttecken. Du kan undkomma en hel sekvens av tecken genom att omsluta den mellan \Qoch \E.
Exempel | Överensstämmelse |
---|---|
a\.? | a.ellera |
a\\\\b | a\\b |
a\[F\] | a[F] |
\Q+-*/\E | +-*/ |
Andra specialtecken kan representeras på liknande sätt (teckenuppsättningarna som kräver escape kan variera beroende på den specifika implementeringen). En del av de tecken som i en eller annan implementering inte kräver escape (till exempel vinkelparenteser < >) kan escapes av läsbarhetsskäl.
Alla teckenMetatecken .(punkten) betyder vilket enskilt tecken som helst, men i vissa implementeringar, exklusive nyradstecknet.
Istället för ett tecken .kan du använda [\s\S](alla blanksteg och tecken som inte är blanksteg, inklusive nyradstecken).
Teckenklasser (teckenuppsättningar)Teckenuppsättningen inom hakparenteser [ ]kallas en teckenklass och låter dig indikera för tolken av reguljära uttryck att ett av de listade tecknen kan förekomma på en given plats i en sträng. I synnerhet [абв]ställer den in möjligheten att förekomst i texten av ett av de tre specificerade tecknen och [1234567890]ställer in korrespondensen till en av siffrorna. Det är möjligt att ange teckenintervall: [А-Яа-я]matchar till exempel alla bokstäver i det ryska alfabetet, förutom bokstäverna "Ё" och "ё" [7] . Vissa implementeringar av reguljära uttryck kan tillåta att teckenklasser inte bara innehåller tecken utan även hela strängar. [åtta]
Om du vill ange tecken som inte ingår i den angivna uppsättningen, använd sedan tecknet ^inom hakparenteser, till exempel [^0-9]betyder något annat tecken än siffror.
Det enklaste sättet att lägga till specialtecken till uppsättningen genom att escape är det enklaste sättet. Men moderna reguljära uttryck ärver också det traditionella tillvägagångssättet – se Traditionella reguljära uttryck .
Vissa teckenklasser kan ersättas med speciella metatecken:
Symbol | Möjlig motsvarighet [9] | Överensstämmelse |
---|---|---|
\d | [0-9] | Цифровой символ |
\D | [^0-9] | Нецифровой символ |
\s | [ \f\n\r\t\v] | Пробельный символ |
\S | [^ \f\n\r\t\v] | Непробельный символ
Пример: Выражение вида ^\S.* или ^[^ \f\n\r\t\v].* будет находить строки, начинающиеся с непробельного символа |
\w[10] | [A-Za-z0-9_] | Буквенный или цифровой символ или знак подчёркивания; буквы ограничены латиницей
Пример: Выражение вида \w+ будет находить и выделять отдельные слова |
\W[11] | [^A-Za-z0-9_] | Любой символ, кроме буквенного или цифрового символа или знака подчёркивания |
Följande tecken låter dig placera det reguljära uttrycket i förhållande till textelement: början och slutet av en rad, ordgränser.
Prestanda | Placera | Exempel | Överensstämmelse |
---|---|---|---|
^ | Början av text (eller rad med ?m modifierare) | ^a | aaa aaa |
$ | Slut på text (eller rad med ?m modifierare) | a$ | aaa aaa |
\b | ordgräns | a\b | aaa aaa |
\ba | aaa aaa | ||
\B | Inte en ordgräns | \Ba\B | aaa aaa |
\G | Tidigare framgångsrik sökning | \Ga | aaa aaa(sökningen stannade vid den fjärde positionen - där den inte hittades a) |
\n - radmatning
\r - vagnretur
Parenteser används för att definiera operationernas omfattning och prioritet . Ett mönster inom en grupp bearbetas som en helhet och kan kvantifieras. Till exempel kommer uttrycket (тр[ау]м-?)*att hitta en sekvens av formen трам-трам-трумтрам-трум-трамтрум.
En vertikal stapel skiljer de giltiga alternativen åt. Till exempel, gray|greymatcher grayeller grey. Man bör komma ihåg att uppräkningen av alternativ utförs från vänster till höger, som de anges.
Om du vill ange en lista med alternativ i ett mer komplext reguljärt uttryck, måste det vara inneslutet i en grupp. Till exempel, gray|greyeller gr(a|e)ybeskriv en sträng grayeller grey. I fallet med alternativ med ett tecken är alternativet att föredra gr[ae]y, eftersom jämförelse med en teckenklass är lättare än att bearbeta en grupp med en kontroll för alla dess möjliga modifierare och generera feedback.
Kvantifieraren efter ett tecken, teckenklass eller grupp bestämmer hur många gånger det föregående uttrycket kan förekomma. Observera att en kvantifierare kan referera till mer än ett tecken i ett reguljärt uttryck endast om det är en teckenklass eller grupp.
Prestanda | Antal repetitioner | Likvärdig | Exempel | Överensstämmelse |
---|---|---|---|---|
? | Noll eller en | {0,1} | colou?r | color,colour |
* | Noll eller mer | {0,} | colou*r | color, colourosv colouur . |
+ | En eller flera | {1,} | colou+r | colour, colouur etc. (men inte color) |
Prestanda | Antal repetitioner | Exempel | Överensstämmelse |
---|---|---|---|
{n} | Exakt n gånger | colou{3}r | colouuur |
{m,n} | Från m till n inklusive | colou{2,4}r | colouur... colouuur_colouuuur |
{m,} | Inte mindre än m | colou{2,}r | colouur, colouuurosv colouuuur . |
{,n} | inte mer än n | colou{,3}r | color... colour_ colouur_colouuur |
En sekvens används ofta för .*att beteckna valfritt antal tecken mellan två delar av ett reguljärt uttryck.
Teckenklasser i kombination med kvantifierare gör att du kan matcha med riktiga texter. Till exempel kolumner med nummer, telefonnummer, postadresser, HTML -uppmärkningselement, etc.
Om tecken { } inte bildar en kvantifierare ignoreras deras speciella betydelse.
Girig och lat kvantifiering Ett exempel på att använda giriga och lata uttryckUttrycket (<.*>)matchar en sträng som innehåller flera HTML -markeringstaggar i sin helhet.
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
För att markera enskilda taggar kan du använda en lat version av detta uttryck: (<.*?>) Det motsvarar inte hela raden som visas ovan, utan till enskilda taggar (markerade i färg):
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
I vissa implementeringar motsvarar kvantifierare i reguljära uttryck den längsta möjliga strängen (kvantifierare är greedy , engelska greedy ). Detta kan vara ett betydande problem. Till exempel förväntas ett uttryck ofta hitta HTML -taggar(<.*>) i text . Men om det finns mer än en HTML-tagg i texten matchar hela raden som innehåller flera taggar uttrycket.
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
Detta problem kan lösas på två sätt.
Användningen av lata kvantifierare kan leda till det omvända problemet när ett uttryck matchar för kort, särskilt den tomma strängen.
Girig | Lat |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
Ett vanligt problem med både giriga och lata uttryck är också returpunkterna för att iterera över varianter av ett uttryck. Perioder placeras efter varje iteration av kvantifieraren. Om tolken inte hittar en matchning efter kvantifieraren, börjar den återvända för alla börvärden och räknar om uttrycket därifrån på ett annat sätt.
Svartsjuk kvantifiering (supergirig)När du letar efter ett uttryck i en sträng kommer tolken att gå ungefär längs följande väg: (a+a+)+a aaaaa
När du använder en svartsjuk kvantifierare kommer endast det första steget i algoritmen att exekveras.
Till skillnad från vanlig (girig) kvantifiering försöker svartsjuk (besittande) kvantifiering inte bara hitta det längsta alternativet, utan tillåter inte heller algoritmen att återgå till tidigare söksteg för att hitta möjliga matchningar för resten av det reguljära uttrycket.
Användningen av svartsjuka kvantifierare ökar sökhastigheten, särskilt i de fall där strängen inte matchar det reguljära uttrycket. Dessutom kan svartsjuka kvantifierare användas för att eliminera oönskade matchningar.
Girig | Svartsjuk |
---|---|
* | *+ |
? | ?+ |
+ | ++ |
{n,} | {n,}+ |
Exempel | Överensstämmelse |
---|---|
ab(xa)*+a | abxaabxaa; men inte , eftersom brevet redan är tagit abxaabxaaa |
Detta är analogt med atomgruppering .
En användning av gruppering är att återanvända tidigare hittade grupper av tecken ( understrängar , block , markerade underuttryck , fångar ). Vid bearbetning av uttrycket lagras de delsträngar som hittas av mönstret inom gruppen i ett separat minnesområde och får ett nummer som börjar från ett. Varje delsträng matchar ett par parenteser i det reguljära uttrycket. Gruppkvantifiering påverkar inte det sparade resultatet, det vill säga endast den första förekomsten sparas. Vanligtvis stöds upp till 9 numrerade delsträngar, numrerade 1 till 9, men vissa tolkar låter dig arbeta med fler. Därefter, inom detta reguljära uttryck, kan notationen från \1till användas för \9att söka efter en matchning med en tidigare hittad delsträng.
Till exempel kommer det reguljära uttrycket (та|ту)-\1att matcha strängen та-таeller ту-ту, men hoppa över strängen та-ту.
Tidigare hittade delsträngar kan också användas när de ersätts med reguljärt uttryck. I detta fall infogas samma symboler i ersättningstexten som i själva uttrycket.
Gruppering utan feedbackOm gruppen endast används för gruppering och dess resultat inte behövs senare, kan du använda grupperingen av typen . Ett separat minnesområde tilldelas inte för resultatet av en sådan gruppering och följaktligen tilldelas det inte ett nummer. Detta har en positiv effekt på hastigheten för uttrycksexekveringen, men minskar läsbarheten. (?:шаблон)
AtomgrupperingEn atomgruppering av en vy , som en gruppering utan feedback, skapar inte feedback. Däremot förbjuder en sådan gruppering att gå tillbaka genom strängen om en del av mönstret redan har hittats. (?>шаблон)
Exempel | Överensstämmelse | Skapat grupper |
---|---|---|
a(bc|b|x)cc | abccaxcc
abccaxcc |
abccaxcc
abccaxcc |
a(?:bc|b|x)cc | abccaxcc,abccaxcc | Nej |
a(?>bc|b|x)cc | abccaxcc
men inte abccaxcc: variant xhittades, andra ignorerade |
Nej |
a(?>x*)xa | hittas inte axxxa: alla är xupptagna och det finns ingen återvändo inuti gruppen |
Atomgruppering är till och med snabbare än gruppering med öppen slinga och sparar CPU-tid medan resten av uttrycket körs, eftersom det förhindrar att andra alternativ inom gruppen kontrolleras när ett alternativ redan har hittats. Detta är mycket användbart när du optimerar grupper med många olika alternativ.
Detta är analogt med svartsjuk kvantifiering .
ModifierareModifierare är giltiga från det ögonblick de inträffar till slutet av det reguljära uttrycket eller den motsatta modifieraren. Vissa tolkar kan tillämpa modifieraren på hela uttrycket, snarare än från det ögonblick det inträffar.
Syntax | Beskrivning | |
---|---|---|
(?i) | Inkluderar | skiftlägeskänslighet _ _ _ |
(?-i) | Stänger av | |
(?s) | Inkluderar | punktmatchningsläge för radmatning och vagnreturtecken |
(?-s) | Stänger av | |
(?m) | Symboler ^och $endast orsaka en matchning | efter och före nyradstecken |
(?-m) | med början och slutet av texten | |
(?x) | Inkluderar | läge utan att ta hänsyn till mellanslag mellan delar av det reguljära uttrycket och låter dig använda #för kommentarer |
(?-x) | Stänger av |
Modifieringsgrupper kan kombineras till en grupp: (?i-sm). En sådan grupp slår på och av läget och ilägena . Om användningen av modifierare endast krävs inom en grupp, indikeras det önskade mönstret inuti gruppen efter modifierarna och efter kolon. Till exempel kommer den att hitta men inte . sm(?-i)(?i:tv)setTVsetTVSET
KommentarerFör att lägga till kommentarer till ett reguljärt uttryck kan du använda kommentarsgrupper i formuläret . En sådan grupp ignoreras helt av tolken och kontrolleras inte för förekomst i texten. Till exempel matchar uttrycket strängen . (?#комментарий)А(?#тут комментарий)БАБ
De flesta implementeringar av reguljära uttryck har ett sätt att söka efter en textbit genom att "se igenom" (men inte inkludera) den omgivande texten som kommer före eller efter den text som söks efter. Negativ uppslagning används mer sällan och "ser till" att de angivna matchningarna, tvärtom, inte sker före eller efter det sökta textfragmentet.
Prestanda | Visa typ | Exempel | Överensstämmelse |
---|---|---|---|
(?=шаблон) | positiva blickar framåt | Людовик(?=XVI) | ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL |
(?!шаблон) | Negativ blick framåt (med negation) | Людовик(?!XVI) | ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL |
(?<=шаблон) | Positiv tillbakablick | (?<=Сергей )Иванов | Сергей Иванов, Игорь Иванов |
(?<!шаблон) | Negativ tillbakablick (med negation) | (?<!Сергей )Иванов | Сергей Иванов, Игорь Иванов |
I många implementeringar av reguljära uttryck är det möjligt att välja vilken väg kontrollen ska ta på ett eller annat ställe i det reguljära uttrycket, baserat på de värden som redan finns.
Prestanda | Förklaring | Exempel | Överensstämmelse |
---|---|---|---|
(?(?=если)то|иначе) | Om skanningsoperationen lyckas exekveras nästa del то, annars exekveras delen иначе. Vilken som helst av de fyra uppslagsoperationerna kan användas i ett uttryck. Observera att uppslagsoperationen är nollbredd, så delarna тоvid en positiv uppslagning eller иначеvid en negativ uppslagning måste inkludera beskrivningen av mallen från uppslagsoperationen. | (?(?<=а)м|п) | мам,пап |
(?(n)то|иначе) | Om den n :e gruppen returnerade ett värde, utförs sökningen efter villkor av mönstret то, annars av mönstret иначе. | (а)?(?(1)м|п) | мам,пап |
På vissa språk (till exempel i JavaScript ) den så kallade. "flaggor" som utökar funktionaliteten för RegExp. Flaggorna anges efter det reguljära uttrycket (ordningen på flaggorna spelar ingen roll). Typiska flaggor:
Flaggan anges efter mönstret, till exempel så här: . /[0-9]$/m
( Engelska grundläggande reguljära uttryck (BRE)). Traditionella UNIX reguljära uttryck . Den grundläggande syntaxen för reguljära uttryck är nu föråldrad av POSIX , men den används fortfarande i stor utsträckning av bakåtkompatibilitetsskäl. Många UNIX-verktyg använder sådana reguljära uttryck som standard.
Denna version innehåller metatecken:
Egenheter:
( Engelska utökade reguljära uttryck (ERE)). Syntaxen är i princip densamma som den traditionella.
Perl- kompatibla reguljära uttryck (PCRE) har en rikare syntax än till och med POSIX ERE . Av denna anledning använder många program den Perl-kompatibla syntaxen för reguljära uttryck.
Unicode är en teckenuppsättning vars syfte är att definiera alla tecken och symboler från alla mänskliga språk, levande och döda. Reguljära uttryck designade för många språk är alltså inte bundna till specifika teckenuppsättningar, utan beskriver dem enligt vedertagna regler. Så, till exempel, ett uttryck för att hitta versaler i alla alfabet skulle se ut så här: /\p{Lu}/.
prestanda | funktionalitet | |
---|---|---|
möjlig kortform | möjlig långform | |
Brev | ||
\p{L} | \p{Letter} | vilken bokstav som helst på vilket språk som helst |
\p{Ll} | \p{Lowercase_Letter} | gemener (gemener) av de som har en stor stavning |
\p{Lu} | \p{Uppercase_Letter} | versaler (versaler) för dem med en gemen stavning |
\p{Lt} | \p{Titlecase_Letter} | en stor bokstav som visas i början av ett gement ord |
\p{L&} | \p{Cased_Letter} | en bokstav som har både stora och små bokstäver |
\p{Lm} | \p{Modifier_Letter} | specialtecken som används som bokstäver |
\p{Lo} | \p{Other_Letter} | ett tecken eller ideogram som inte har några versaler eller gemener |
Specialsymboler | ||
\p{M} | \p{Mark} | tecken infogade för att kombinera med andra tecken (t.ex. accenter, omljud, omslagsparenteser) |
\p{Mn} | \p{Non_Spacing_Mark} | ett tecken infogat för att kombineras med andra tecken utan att ta upp extra bredd |
\p{Mc} | \p{Spacing_Combining_Mark} | tecken som infogas för att kombineras med andra tecken och tar upp extra bredd (som på många orientaliska språk) |
\p{Me} | \p{Enclosing_Mark} | karaktärer som omsluter en karaktär. Till exempel cirkel, kvadrat osv. |
Mellanslag och separatorer | ||
\p{Z} | \p{Separator} | alla typer av utrymmen eller osynliga separatorer |
\p{Zs} | \p{Space_Separator} | blanksteg som är osynliga men har en bredd |
\p{Zl} | \p{Line_Separator} | linjeseparationssymbol U+2028 |
\p{Zp} | \p{Paragraph_Separator} | paragraftecken U+2029 |
Matematiska symboler | ||
\p{S} | \p{Symbol} | matematiska symboler, valutasymboler, pseudografiska symboler (ramar) etc. |
\p{Sm} | \p{Math_Symbol} | några matematiska symboler |
\p{Sc} | \p{Currency_Symbol} | alla valutasymboler |
\p{Sk} | \p{Modifier_Symbol} | kombinerat tecken (märke) som en kombination av själva tecknet och märkestecknet |
\p{So} | \p{Other_Symbol} | olika symboler, icke-matematiska, icke-valutasymboler eller kombinationer därav |
Numeriska tecken | ||
\p{N} | \p{Number} | alla typer av digitala karaktärer på alla språk |
\p{Nd} | \p{Decimal_Digit_Number} | siffror från noll till nio på alla språk |
\p{Nl} | \p{Letter_Number} | en siffra som kan se ut som bokstäver, till exempel romerska siffror |
\p{No} | \p{Other_Number} | ett tal representerat som en upphöjd eller nedsänkt skrift, eller ett tal som inte består av siffror (exklusive siffror från ideografiska skrifter) |
Punkter | ||
\p{P} | \p{Punctuation} | någon form av skiljetecken |
\p{Pd} | \p{Dash_Punctuation} | någon form av bindestreck eller bindestreck |
\p{Ps} | \p{Open_Punctuation} | någon form av öppningsfästen |
\p{Pe} | \p{Close_Punctuation} | någon form av stängningsfäste |
\p{Pi} | \p{Initial_Punctuation} | någon form av öppningscitat |
\p{Pf} | \p{Final_Punctuation} | någon form av avslutande citat |
\p{Pc} | \p{Connector_Punctuation} | skiljetecken, som understreck eller ordsammansättningar |
\p{Po} | \p{Other_Punctuation} | alla typer av skiljetecken som inte är punkter, parenteser, citattecken eller kopplingar |
Kontrolltecken | ||
\p{C} | \p{Other} | osynliga kontrolltecken och oanvända positioner |
\p{Cc} | \p{Control} | ASCII eller Latin-1 kontrolltecken: 0x00-0x1F och 0x7F-0x9F |
\p{Cf} | \p{Format} | osynliga formateringsindikatorer |
\p{Co} | \p{Private_Use} | alla positioner reserverade för personligt bruk |
\p{Cs} | \p{Surrogate} | hälften av surrogatparen kodade i UTF-16 |
\p{Cn} | \p{Unassigned} | alla positioner som inte har symboler tilldelade |
I vissa fall är det bekvämt att använda reguljära uttryck för att analysera textfragment på naturligt språk , det vill säga skrivna av människor, och som eventuellt innehåller stavfel eller icke-standardiserade ordanvändningar. Om du till exempel genomför en undersökning (säg på en webbplats) "vilken tunnelbanestation använder du", kan det visa sig att besökare kan ange "Nevsky Prospekt" som:
Här är de vanliga reguljära uttrycken inte tillämpliga, främst på grund av det faktum att orden som ingår i mönstren kanske inte matchar särskilt exakt (fuzzy), men det skulle ändå vara bekvämt att beskriva de strukturella beroenden mellan elementen i mönstret med reguljära uttryck, till exempel, i vårt fall indikerar att matchningen kan vara med provet "Nevsky Prospekt" ELLER "Griboedov Canal", dessutom kan "Prospect" förkortas till "pr" eller absent, och förkortningen "Eb. " kan placeras före "Canal".
Denna uppgift liknar fulltextsökning , skiljer sig åt genom att här måste ett kort fragment jämföras med en uppsättning mönster, och i fulltextsökning är mönstret i regel ett, medan textfragmentet är mycket stort , eller det lexikaliska disambigueringsproblemet , som dock inte tillåter att specificera strukturerande relationer mellan mönsterelement.
Det finns ett litet antal bibliotek som implementerar mekanismen för reguljära uttryck med möjlighet till otydlig jämförelse:
Formella språk och formella grammatiker | |
---|---|
Allmänna begrepp | |
Typ 0 | |
Typ 1 |
|
Typ 2 | |
Typ 3 |
|
analysera |