Regular Expressions
Escaping
Sök…
Raw String Literals
Det är bäst för läsbarhet (och din förnuft) att undvika att fly. Det är där råa strängslitteraler kommer in. (Observera att vissa språk tillåter avgränsare, vilket är att föredra framför strängar vanligtvis. Men det är ett annat avsnitt.)
De fungerar vanligtvis på samma sätt som det här svaret beskriver :
[A] backslash,
\
, betraktas som "bara en backslash" (förutom när det kommer precis före ett offert som annars skulle avsluta det bokstavliga) - inga "escape-sekvenser" för att representera newlines, flikar, backspaces, form-feeds , och så vidare.
Inte alla språk har dem, och de som använder olika syntax. C # kallar dem faktiskt verbatim strängbokstäver , men det är samma sak.
Pytonorm
pattern = r"regex"
pattern = r'regex'
C ++ (11+)
Syntaxen här är extremt mångsidig. Den enda regeln är att använda en avgränsare som inte visas någonstans i regexen. Om du gör det, behövs ingen ytterligare rymning för något i strängen. Observera att parentesen ()
inte är en del av regexet:
pattern = R"delimiter(regex)delimiter";
VB.NET
Använd bara en vanlig sträng. Återfall är alltid bokstäver .
C #
pattern = @"regex";
Observera att denna syntax också tillåter ""
(två dubbla citat) som en undgått form av "
.
strängar
I de flesta programmeringsspråk måste varje backslash fördubblas i strängbokstäver för att ha ett backstänk i en sträng som genereras från en strängbokstav. Annars tolkas det som ett utrymme för nästa karaktär.
Tyvärr måste varje backslash som krävs av regex vara en bokstavlig backslash. Därför blir det nödvändigt att ha "rymda flykt" ( \\
) när regexer genereras från strängbokstäver.
Dessutom kan citat ( "
eller '
) i strängbokstäverna behöva undkommas, beroende på vilken som omger strängbokstavstiftningen. På vissa språk är det möjligt att använda endera citattyp för en sträng (välj den mest läsbara för undgår hela strängens bokstavliga).
På vissa språk (t.ex. Java <= 7) kan regexer inte uttryckas direkt som bokstäver som /\w/
; de måste genereras från strängar, och vanligtvis används strängbokstäver - i detta fall "\\w"
. I dessa fall måste bokstavliga karaktärer som citat, bakslag etc. undgå. Det enklaste sättet att uppnå detta kan vara att använda ett verktyg (som RegexPlanet ). Det här specifika verktyget är utformat för Java, men det fungerar för alla språk med en liknande strängsyntax.
Vilka karaktärer måste undkommas?
Teckenfång är det som gör att vissa tecken (reserverade av regex-motorn för att manipulera sökningar) bokstavligen kan letas efter och hittas i inmatningssträngen. Rymning beror på sammanhang, därför täcker detta exempel inte strängen eller avgränsaren flyr.
snedstreck
Att säga att backslash är "flykten" karaktär är lite missvisande. Backslash rymmer och backslash ger; den växlar faktiskt på eller av metakaraktär kontra bokstavlig status för karaktären framför den.
För att kunna använda en bokstavlig backslash var som helst i en regex, måste den undgås av en annan backslash.
Rymning (utanför teckenklasser)
Det finns flera tecken som måste undkommas för att tas bokstavligen (åtminstone utanför röstklasser):
- Fästen:
[]
- Parenteser:
()
- Lockiga hängslen:
{}
- Operatörer:
*
,+
?
,|
- Förankrar:
^
,$
- Övrigt:
.
,\
- För att kunna använda en bokstavlig
^
i början eller en bokstavlig$
i slutet av en regex måste tecknet undkommas. - Vissa smaker använder bara
^
och$
som metatecken när de är i början eller slutet av regexet respektive. I dessa smaker är inget extra utrymme nödvändigt. Det är oftast bara bäst att fly dem ändå.
Flyr inom karaktärsklasser
- Det är bästa praxis att undgå fyrkantiga parenteser (
[
och]
) när de visas som bokstäver i en kolklass. Under vissa förhållanden krävs det inte, beroende på smaken , men det skadar läsbarheten. - Caret,
^
, är en metatecken när den sätts som den första karaktären i en kolklass:[^aeiou]
. Överallt i char-klassen är det bara en bokstavlig karaktär. - Streck,
-
, är en metatecken, såvida det inte är i början eller slutet av en karaktärsklass. Om den första karaktären i char-klassen är en caret^
, kommer det att vara en bokstavlig om det är den andra karaktären i char-klassen.
Rymmer ersättningen
Det finns också regler för att rymma inom ersättningen, men ingen av reglerna ovan gäller. De enda metatecken är $
och \
, åtminstone när $
kan användas för att referera till fångstgrupper (som $1
för grupp 1). För att använda en bokstavlig $
, undgå det: \$5.00
. Likaså \
: C:\\Program Files\\
.
BRE Undantag
Medan ERE (utökade reguljära uttryck) speglar den typiska syntetxen i Perl-stil, har BRE (grundläggande reguljära uttryck) betydande skillnader när det gäller att rymma:
- Det finns olika korta syntaxer. Alla
\d
,\s
,\w
och så vidare är borta. I stället har den en egen syntax (som POSIX förvirrande kallar "karaktärsklasser"), som[:digit:]
. Dessa konstruktioner måste ligga inom en karaktärsklass. - Det finns få metatecken (
.
,*
,^
,$
) Som kan användas normalt. ALLA andra metatecken måste undvikas annorlunda:
Hängslen {}
-
a{1,2}
matchara{1,2}
. För att matcha antingena
elleraa
, använda\{1,2\}
Parenteser ()
-
(ab)\1
är ogiltigt eftersom det inte finns någon fångstgrupp 1. För att fixa den och matchaabab
använd\(ab\)\1
bakstreck
- Inuti kolklasser (som kallas parentesuttryck i POSIX) är backslash inte en metacharacter (och behöver inte undgå).
[\d]
matchar antingen\
ellerd
. - Överallt, fly som vanligt.
Övrig
-
+
och?
är bokstavliga. Om BRE-motorn stöder dem som metatecken, måste de rymmas som\?
och\+
.
/ Avgränsare /
Många språk tillåter regex att stängas in eller avgränsas mellan ett par specifika tecken, vanligtvis framåtstrecket /
.
Avgränsare påverkar flykten: om avgränsaren är /
och regexet måste leta efter /
literaler, måste framåtstrecket rymmas innan det kan vara en bokstavlig ( \/
).
Överdriven undkommande skadar läsbarheten, så det är viktigt att överväga tillgängliga alternativ:
Javascript är unikt eftersom det tillåter framåt snedstreck som en avgränsare, men inget annat (även om det tillåter strängade regexer ).
Perl tillåter till exempel nästan vad som helst vara en avgränsare. Till och med arabiska tecken:
$str =~ m ش ش
Specifika regler nämns i Perls dokumentation .
PCRE tillåter två typer avgränsare: matchade avgränsare och avgränsare i konsolstil. Matchade avgränsare använder sig av enparts karaktärspar, medan parentesformat avgränsar använder sig av ett par tecken som representerar ett öppnings- och stängningspar.
- Matchande avgränsare
!"#$%&'*+,./:;=?@^_`|~-
- Avgränsare för parentesstil:
()
,{}
,[]
,<>