Vanliga uttryck

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.   

Funktioner

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.

Historik

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 .

I teorin om formella språk

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] .

Syntax

Symbolrepresentation

Vanliga tecken ( bokstavliga tecken ) och specialtecken ( metatecken )

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 tecken

Metatecken .(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_] Любой символ, кроме буквенного или цифрового символа или знака подчёркивания

Position i en sträng

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)

Specialtecken

\n - radmatning

\r - vagnretur

Gruppbeteckning

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 трам-трам-трумтрам-трум-трамтрум.

Uppräkning

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.

Kvantifiering (sök efter sekvenser)

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 uttryck

Uttrycket (<.*>)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.

  1. Tänk på tecken som inte matchar det önskade mönstret ( <[^>]*>för ovanstående fall).
  2. Definiera en kvantifierare som icke-girig ( lazy , English  lazy ) - de flesta implementeringar låter dig göra detta genom att lägga till ett frågetecken efter den.

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

  1. aaaaa
  2. aaaa
  3. aaaaa
  4. aaa
  5. aaaaa
  6. aaaa
  7. aaaaa- och först då, efter att ha kontrollerat alla returpunkter, slutar det.

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 .

Gruppering

Feedback

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 feedback

Om 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. (?:шаблон)

Atomgruppering

En 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 .

Modifierare

Modifierare ä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

Kommentarer

Fö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 . (?#комментарий)А(?#тут комментарий)БАБ

Se framåt och bakåt

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) (?<!Сергей )Иванов Сергей Иванов, Игорь Иванов

Sök efter villkor

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)м|п) мам,пап

Flaggor

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:

  • g  - global sökning (alla matchningar med sökmönstret bearbetas);
  • i  - skiftläge spelar ingen roll;
  • m  - flerradssökning;
  • s  - texten behandlas som en rad, i det här fallet matchar metateckenet .(punkten) ett enskilt tecken, inklusive nyradstecknet;
  • u  - unicode-tolkning. Uttrycket kan innehålla speciella mönster som är specifika för Unicode, till exempel /\p{Lu}/ versaler.

Flaggan anges efter mönstret, till exempel så här: . /[0-9]$/m

Variationer av reguljära uttryck

Grundläggande POSIX reguljära uttryck

( 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:

  • .;
  • [ ];
  • [^ ];
  • ^(gäller endast i början av ett uttryck);
  • $(gäller endast i slutet av uttrycket);
  • *;
  • \{ \} - initial version för { };
  • \( \) - initial version för ( );
  • \n, där n  är ett tal från 1 till 9.

Egenheter:

  • Asterisken måste komma efter uttrycket som matchar det enskilda tecknet. Exempel: [xyz]*.
  • Uttrycket bör anses ogiltigt. I vissa fall matchar den noll eller fler upprepningar av strängen . I andra matchar den strängen .\(блок\)*блокблок*
  • Inom en teckenklass ignoreras vanligtvis specialteckenvärden. Speciella fall:
    • För att lägga till en karaktär ^till en uppsättning får den inte placeras där först.
    • För att lägga till en karaktär -till en uppsättning måste den placeras där antingen först eller sist. Till exempel:
      • DNS-namnmall, som kan innehålla bokstäver, siffror, minus och avgränsningspunkt: [-0-9a-zA-Z.];
      • alla tecken utom minus och nummer: [^-0-9].
    • För att lägga till en symbol [eller ]till en uppsättning måste den placeras där först. Till exempel:
      • [][ab]matchar ], [, aeller b.

Utökade POSIX reguljära uttryck

( Engelska  utökade reguljära uttryck (ERE)). Syntaxen är i princip densamma som den traditionella.

  • Tog bort användningen av snedstreck för metatecken { }och ( ).
  • Ett omvänt snedstreck före en metatecken upphäver dess speciella betydelse (se Representera specialtecken ).
  • Teoretiskt oregelbunden design förkastas .\n
  • Lade till metatecken +, ?, |.

Perl -kompatibla reguljära uttryck

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.

Reguljära uttryck kompatibla med Unicode

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}/.

Vissa regexp-uttryck är unicode:
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

Luddiga reguljära uttryck

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:

  • Nevskij
  • Nevsk. Ave.
  • Ny aveny
  • emb. Griboyedov-kanalen ("Griboedov-kanalen" är namnet på den andra utgången från tunnelbanestationen Nevsky Prospekt)

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:

  • TRE är ett gratis C-bibliotek som använder POSIX-liknande reguljära uttryckssyntax (stabilt projekt);
  • FREJ är ett Java-bibliotek med öppen källkod som använder en Lisp-formad syntax och saknar många av funktionerna i konventionella reguljära uttryck, men fokuserar på olika typer av automatiska ersättningar av textfragment (betaversion).

Implementeringar

  • NFA ( nondeterministic  finite-state automata  - non- deterministic finite automata ) använder en girig backtracking-algoritm , kontrollerar alla möjliga expansioner av ett reguljärt uttryck i en viss ordning och väljer det första lämpliga värdet. NFA kan hantera underuttryck och bakåtreferenser. Men på grund av återställningsalgoritmen kan traditionella NFA kontrollera samma plats flera gånger, vilket negativt påverkar arbetshastigheten. Eftersom traditionella NFA tar den första matchningen den hittar, kanske den inte hittar den längsta matchningen (detta krävs av POSIX- standarden , och det finns modifieringar av NFA som uppfyller detta krav - GNU sed ). Det är denna reguljära uttrycksmekanism som används till exempel i Perl , Tcl och .NET .
  • DFA ( eng.  deterministic finite-state automata  - deterministic finite automata ) fungerar linjärt i tiden, eftersom de inte använder rollbacks och aldrig dubbelkollar någon del av texten. De kan garanterat hitta den längsta möjliga strängen. En DFA innehåller bara ett slutligt tillstånd, så det hanterar inte bakåtreferenser, och det stöder inte heller explicita tilläggskonstruktioner, vilket betyder att den inte heller kan hantera underuttryck. DFA används till exempel i lex och egrep .

Se även

Anteckningar

  1. docs.oracle.com . Hämtad 20 augusti 2013. Arkiverad från originalet 9 september 2013.
  2. MSDN . Hämtad 11 juli 2011. Arkiverad från originalet 15 september 2012.
  3. Aho A., Ulman J. Teori om analys, översättning och sammanställning. Syntaktisk analys. - Världen. - M. , 1978. - T. 2.
  4. Många böcker använder ∪, + eller ∨ istället för |.
  5. Nikita Popov. Den sanna kraften i reguljära uttryck (15 juni 2012). Hämtad 30 maj 2019. Arkiverad från originalet 16 maj 2019. Översättning: The True Power of Regular Expressions Arkiverad 30 maj 2019 på Wayback Machine .
  6. Vladimir Komendantsky. Matchningsproblem för reguljära uttryck med variabler // Trender i funktionell programmering: 13:e internationella symposium, TFP 2012, St Andrews, Storbritannien, 12-14 juni 2012, Revised Selected Papers. — Springer, 2013. — S. 149–150. — ISBN 9783642404474 .
  7. För att använda bokstavssekvenser måste du ställa in rätt teckentabell, där dessa sekvenser går i ordning från och till de angivna tecknen. För det ryska språket är dessa Windows-1251 , ISO 8859-5 och Unicode , eftersom i DOS-855 , DOS-866 och KOI8-R ryska bokstäver inte går i en hel grupp eller är inte ordnade alfabetiskt. Särskild uppmärksamhet bör ägnas bokstäver med diakritiska tecken , som den ryska Ё / ё, som vanligtvis är utspridda utanför huvudkaraktärernas intervall.
  8. UTS #18: Unicode reguljära  uttryck . Hämtad 8 augusti 2021. Arkiverad från originalet 8 augusti 2021.
  9. Varierar beroende på implementeringen av motorn för reguljära uttryck
  10. Det finns en motsvarande notation [[:ord:]]
  11. Det finns en motsvarande notation [^[:ord:]]

Litteratur

  • Friedl, J. Regular Expressions = Mastering Regular Expressions. - St Petersburg. : "Peter" , 2001. - 352 sid. — (Programmerarens bibliotek). — ISBN 5-318-00056-8 .
  • Smith, Bill. Metoder och algoritmer för beräkning på strängar (regexp) = Computing Patterns in Strings. - M . : "Williams" , 2006. - 496 sid. — ISBN 0-201-39839-7 .
  • Forta, Ben. Lär dig dina egna reguljära uttryck. 10 minuter per lektion = Sams Lär dig själv reguljära uttryck på 10 minuter. - M . : "Williams" , 2005. - 184 sid. — ISBN 5-8459-0713-6 .
  • Jan Goyverts, Steven Levitan. Vanliga uttryck. Kokbok = Reguljära uttryck: Kokbok. - St Petersburg. : "Symbol-Plus" , 2010. - 608 sid. - ISBN 978-5-93286-181-3 .
  • Melnikov SV Perl för professionella programmerare. Vanliga uttryck. - M . : "Binom" , 2007. - 190 sid. — (Fundamentals of Information Technology). — ISBN 978-5-94774-797-3 .
  • Michael Fitzgerald. Vanliga uttryck. Grunderna. - M. : "Williams" , 2015. - 144 sid. — ISBN 978-5-8459-1953-3 .

Länkar