regex(7)

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök

regex(7)

Miscellaneous Information Manual regex(7)

NAMN

regex - POSIX.2 reguljära uttryck

BESKRIVNING

Reguljära uttryck ("RE"s), som definieras i POSIX.2, finns i två former: moderna REs (ungefär de som används av egrep(1); POSIX.2 kallar dessa "extended" REs) och föråldrade REs (ungefär de som används av ed(1); POSIX.2 "basic" REs). Föråldrade REs existerar främst för bakåtkompatibilitet i vissa gamla program och de diskuteras i slutet. POSIX.2 lämnar vissa aspekter av RE-syntax och semantik öppna; "(!)" markerar beslut om dessa aspekter som kanske inte är fullt portabla till andra POSIX.2-implementationer.

Ett (modernt) RE består av en eller fler icke-tomma(!) grenar, separerade med '|'. Det matchar allt som matchar en av grenarna.

En gren består av en eller fler delar, sammanfogade. Det matchar en match för den första, följt av en match för den andra, och så vidare.

En del är ett atom som möjligtvis följs av en enkel(!) '*', '+', '?', eller gräns. Ett atom följt av '*' matchar en sekvens av 0 eller fler matchningar av atomen. Ett atom följt av '+' matchar en sekvens av 1 eller fler matchningar av atomen. Ett atom följt av '?' matchar en sekvens av 0 eller 1 matchningar av atomen.

En gräns är '{' följt av ett icke-negativt decimaltal, möjligen följt av ',', eventuellt följt av ett annat icke-negativt decimaltal, alltid följt av '}'. Heltalen måste ligga mellan 0 och RE_DUP_MAX (255(!)) inklusive, och om det finns två av dem får det första inte överstiga det andra. Ett atom följt av en gräns som innehåller ett heltal i och inget komma matchar en sekvens av exakt i matchningar av atomen. Ett atom följt av en gräns som innehåller ett heltal i och ett komma matchar en sekvens av i eller fler matchningar av atomen. Ett atom följt av en gräns som innehåller två heltal i och j matchar en sekvens av i till j (inklusive) matchningar av atomen.

En atom är ett reguljärt uttryck inneslutet i "()" (som matchar ett match för det reguljära uttrycket), en tom uppsättning "()" (som matchar den tomma strängen)(!), en hakparentesuttryck (se nedan), '.' (som matchar vilken enskild tecken som helst), '^' (som matchar den tomma strängen i början av en rad), '$' (som matchar den tomma strängen i slutet av en rad), en '\' följd av ett av tecknen "^.[$()|*+?{" (som matchar det tecknet som en vanlig tecken), en '\' följd av vilket annat tecken som helst(!) (som matchar det tecknet som en vanlig tecken, som om '\' inte var närvarande(!)), eller ett enstaka tecken utan annan betydelse (som matchar det tecknet). Ett '{' följt av ett tecken som inte är en siffra är ett vanligt tecken, inte början på en gräns(!). Det är olagligt att avsluta ett RE med '\'.

En hakparentesuttryck är en lista av tecken inneslutna i "[]". Det matchar normalt vilket enskilt tecken som helst från listan (men se nedan). Om listan börjar med '^', matchar det vilket enskilt tecken som helst (men se nedan) som inte är från resten av listan. Om två tecken i listan separeras med '-', är detta kortform för hela intervallet av tecken mellan dessa två (inklusive) i kollateringssekvensen, till exempel, "[0-9]" i ASCII matchar vilket decimalt tecken som helst. Det är olagligt(!) att två intervall delar ett slutpunkt, till exempel "a-c-e". Intervall är mycket beroende av kollateringssekvensen, och portabla program bör undvika att förlita sig på dem.

För att inkludera ett litteralt ']' i listan, gör det till det första tecknet (efter ett möjligt '^'). För att inkludera ett litteralt '-', gör det till det första eller sista tecknet, eller den andra slutpunkten för ett intervall. För att använda ett litteralt '-' som den första slutpunkten för ett intervall, omge det med "[." och ".]" för att göra det till ett kollateringselement (se nedan). Med undantag för dessa och vissa kombinationer som använder '[' (se nästa avsnitt), förlorar alla andra specialtecken, inklusive '\', sin speciella betydelse inom ett hakparentesuttryck.

Inom ett hakparentesuttryck representerar ett kollateringselement (ett tecken, en sekvens av fler tecken som kollaterar som om det vore ett tecken, eller ett kollateringssekvensnamn för någon av dem) inneslutet i "[." och ".]" sekvensen av tecken för det kollateringselementet. Sekvensen är ett enstaka element i hakparentesuttryckens lista. Ett hakparentesuttryck som innehåller ett multiteckens kollateringselement kan alltså matcha fler än ett tecken, till exempel, om kollateringssekvensen inkluderar ett "ch"-kollateringselement, matchar RE ".ch.*c" de första fem tecknen av "chchcc".

Inom ett hakparentesuttryck representerar ett kollateringselement inneslutet i "[=" och "=]" en ekvivalensklass, som står för sekvenser av tecken för alla kollateringselement som är ekvivalenta med det, inklusive det. (Om det inte finns andra ekvivalenta kollateringselement, behandlas det som om de inneslutande avgränsarna vore "[." och ".]"). Till exempel, om o och ô är medlemmar av en ekvivalensklass, då "=o=", "=ô=", och "[oô]" är alla synonyma. En ekvivalensklass får inte(!) vara slutpunkten för ett intervall.

Inom ett hakparentesuttryck, namnet på en teckenkategori innesluten i "[:" och ":]" står för listan av alla tecken som tillhör den kategorin. Standardteckenkategorinamn är:

alnum   digit   punct  
alpha   graph   space  
blank   lower   upper  
cntrl   print   xdigit  

Dessa står för de teckenkategorier som definieras i wctype(3). En lokal kan tillhandahålla andra. En teckenkategori får inte användas som slutpunkten för ett intervall.

Om ett RE kan matcha mer än en delsträng av en given sträng, matchar RE den som börjar först i strängen. Om RE kan matcha mer än en delsträng som börjar vid den punkten, matchar det den längsta. Deluttryck matchar också de längsta möjliga delsträngarna, med undantaget att hela matchen ska vara så lång som möjligt, med deluttryck som börjar tidigare i RE som prioriteras framför de som börjar senare. Notera att högre nivåers deluttryck därmed tar prioritet över deras lägre nivåers komponentdeluttryck.

Matchlängder mäts i tecken, inte kollateringselement. En tom sträng anses vara längre än ingen match alls. Till exempel, "bb*" matchar de tre mittersta tecknen av "abbbc", "(wee|week)(knights|nights)" matchar alla tio tecknen i "weeknights", när "(.*).*" matchas mot "abc", matchar den parentesuttryckta subuttrycket alla tre tecknen, och när "(a*)*" matchas mot "bc", matchar både hela RE och den parentesuttryckta subuttrycket den tomma strängen.

Om falloberoende matchning är specificerat, är effekten ungefär som om alla falldistinktioner hade försvunnit från alfabetet. När ett alfabetiskt tecken som finns i flera fall visas som ett vanligt tecken utanför ett hakparentesuttryck, transformeras det effektivt till ett hakparentesuttryck som innehåller båda fallen, till exempel blir 'x' "[xX]". När det visas inom ett hakparentesuttryck, läggs alla fallmotparter av det till hakparentesuttrycket, så att till exempel "[x]" blir "[xX]" och "[^x]" blir "[^xX]".

Det finns ingen särskild gräns för längden på REs(!). Program som är avsedda att vara portabla bör inte använda REs längre än 256 byte, eftersom en implementation kan vägra att acceptera sådana REs och ändå förbli POSIX-kompatibel.

Föråldrade ("basic") reguljära uttryck skiljer sig på flera sätt. '|', '+', och '?' är vanliga tecken och det finns ingen motsvarighet för deras funktionalitet. Avgränsarna för gränser är "\{" och "\}", där '{' och '}' för sig själva är vanliga tecken. Parenteserna för nästlade subuttryck är "\(" och "\)", där '(' och ')' för sig själva är vanliga tecken. '^' är ett vanligt tecken förutom i början av RE eller(!) början av ett parentesuttryck, '$' är ett vanligt tecken förutom i slutet av RE eller(!) slutet av ett parentesuttryck, och '*' är ett vanligt tecken om det visas i början av RE eller början av ett parentesuttryck (efter ett möjligt ledande '^').

Slutligen finns det en ny typ av atom, en bakreferens: '\' följt av en icke-noll decimal siffra d matchar samma teckensekvens som matchades av det d:te parentesuttrycket (numrering av subuttryck enligt öppnande parentesers positioner, från vänster till höger), så att till exempel "\([bc]\)\1" matchar "bb" eller "cc" men inte "bc".

BUGGAR

Att ha två typer av REs är ett fel.

Den nuvarande POSIX.2-specifikationen säger att ')' är ett vanligt tecken i avsaknad av en obalanserad '(', detta var ett oavsiktligt resultat av en ordalydelsefel, och ändringar är troliga. Undvik att förlita sig på detta.

Bakreferenser är ett förfärligt fel, vilket ger stora problem för effektiva implementationer. De är också något vagt definierade (matchar "a\(\(b\)*\2\)*d" "abbbd"?). Undvik att använda dem.

POSIX.2:s specifikation av falloberoende matchning är vag. Den definition av "ett fall innebär alla fall" som ges ovan är nuvarande konsensus bland implementerare som den rätta tolkningen.

FÖRFATTARE

Denna sida hämtades från Henry Spencer's regex-paket.

SE ÄVEN

COLOPHON

Denna sida är en del av man-pages (Linux kernel och C-bibliotek användargränssnitt dokumentation) projektet. Information om projektet finns på ⟨https://www.kernel.org/doc/man-pages/⟩. Om du har en buggrapport för denna manual, se ⟨https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/tree/CONTRIBUTING⟩. Denna sida hämtades från tarballen man-pages-6.9.1.tar.gz hämtad från ⟨https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/⟩ den 26 juni 2024.

Exempel

1. Matcha alla e-postadresser i en text

Om du vill hitta alla e-postadresser i en text kan du använda följande regex:

```regex [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}

Sidslut

Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man7/regex.7.html
PHP


Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till PC Service som har sponsrat Linux.se med webbhotell.