Zoeken…


Raw String Literals

Het is het beste voor de leesbaarheid (en uw verstand) om te voorkomen dat u ontsnapt aan de ontsnappingen. Dat is waar raw strings literals binnenkomen. (Merk op dat sommige talen scheidingstekens toestaan, die meestal de voorkeur hebben boven strings. Maar dat is een andere sectie.)

Ze werken meestal op dezelfde manier als dit antwoord beschrijft :

[A] backslash, \ , wordt beschouwd als "slechts een backslash" (behalve wanneer het vlak voor een citaat komt dat anders het letterlijke zou beëindigen) - geen "escape-reeksen" om nieuwe regels, tabs, backspaces, formulier-feeds weer te geven , enzovoorts.

Niet alle talen hebben ze, en die die verschillende syntaxis gebruiken. C # noemt ze eigenlijk letterlijk letterlijke tekenreeksen , maar het is hetzelfde.


Python

pattern = r"regex"
pattern = r'regex'

C ++ (11+)

De syntaxis is hier uiterst veelzijdig. De enige regel is om een scheidingsteken te gebruiken dat nergens in de regex voorkomt. Als u dat doet, is geen extra ontsnapping nodig voor iets in de string. Merk op dat de haakjes () geen deel uitmaken van de regex:

pattern = R"delimiter(regex)delimiter";

VB.NET

Gebruik gewoon een normale string. Backslashes zijn ALTIJD letterlijk .

C #

pattern = @"regex";

Merk op dat deze syntaxis ook "" (twee dubbele aanhalingstekens) toestaat als een ontsnapte vorm van " .

strings

In de meeste programmeertalen moet elke backslash in de string letterlijk worden verdubbeld om een backslash te hebben in een string die is gegenereerd op basis van een letterlijke string. Anders wordt het geïnterpreteerd als een ontsnapping voor het volgende karakter.

Helaas moet elke backslash die door de regex wordt vereist, een letterlijke backslash zijn. Dit is de reden waarom het nodig is om "ontsnapte ontsnappingen" ( \\ ) te hebben wanneer regexen worden gegenereerd uit stringliterals.

Bovendien is het mogelijk dat aanhalingstekens ( " of ' ) in de tekenreeks letterlijk moeten worden omzeild, afhankelijk van welke de tekenreeks letterlijk omringen. In sommige talen is het mogelijk om een van beide aanhalingstekens te gebruiken voor een tekenreeks (kies de meest leesbare voor ontsnappen aan de hele letterlijke reeks).

In sommige talen (bijvoorbeeld: Java <= 7) kunnen regexen niet direct worden uitgedrukt als letterlijke tekens zoals /\w/ ; ze moeten worden gegenereerd op basis van tekenreeksen en normaal worden tekenreeksliteralen gebruikt - in dit geval "\\w" . In deze gevallen moeten letterlijke tekens zoals aanhalingstekens, backslashes, enz. Worden ontsnapt. De eenvoudigste manier om dit te bereiken, is met behulp van een tool (zoals RegexPlanet ). Deze specifieke tool is ontworpen voor Java, maar het werkt voor elke taal met een vergelijkbare string-syntaxis.

Aan welke tekens moet je ontsnappen?

Door tekens te laten ontsnappen, kunnen bepaalde tekens (gereserveerd door de regex-engine voor het manipuleren van zoekopdrachten) letterlijk worden gezocht en gevonden in de invoertekenreeks. Ontsnappen is afhankelijk van context, daarom is dit voorbeeld niet van toepassing op ontsnappen van tekenreeksen of scheidingstekens .

backslashes

Zeggen dat backslash het "ontsnappingskarakter" is, is een beetje misleidend. Backslash ontsnapt en backslash brengt; het schakelt de metacharacter versus de letterlijke status van het personage ervoor in of uit.

Om een letterlijke backslash overal in een regex te gebruiken, moet deze door een andere backslash worden ontlopen.

Ontsnappen (buiten tekenklassen)

Er zijn verschillende tekens waaraan moet worden ontsnapt om letterlijk te worden genomen (tenminste buiten char-klassen):

  • Beugels: []
  • Haakjes: ()
  • Krullende accolades: {}
  • Operators: * , + ? , |
  • Ankers: ^ , $
  • Anderen: . , \
  • Om een letterlijke ^ aan het begin of een letterlijke $ aan het einde van een regex te gebruiken, moet het teken worden ontsnapt.
  • Sommige smaken gebruiken alleen ^ en $ als metatekens wanneer ze respectievelijk aan het begin of einde van de regex staan. In die smaken is geen extra ontsnapping nodig. Het is meestal gewoon het beste om ze toch te ontsnappen.

Ontsnappen binnen karakterklassen

  • Het is best practice om vierkante haken ontsnappen ( [ en ] ) wanneer ze verschijnen als letterlijke in een char klasse. Onder bepaalde omstandigheden is dit niet vereist, afhankelijk van de smaak , maar het tast de leesbaarheid aan.
  • De caret, ^ , is een metakarakter wanneer het als het eerste karakter in een char-klasse wordt geplaatst: [^aeiou] . Overal in de char-klasse is het slechts een letterlijk karakter.
  • Het streepje, - , is een metakarakter, tenzij het aan het begin of einde van een tekenklasse staat. Als het eerste karakter in de char-klasse een caret is ^ , dan is het letterlijk als het het tweede karakter in de char-klasse is.

Ontsnappen aan de vervanging

Er zijn ook regels voor ontsnappen binnen de vervanging, maar geen van de bovenstaande regels is van toepassing. De enige metatekens zijn $ en \ , tenminste wanneer $ kan worden gebruikt om naar vastleggroepen te verwijzen (zoals $1 voor groep 1). Om een letterlijke $ te gebruiken, moet je eraan ontsnappen: \$5.00 . Evenzo \ : C:\\Program Files\\ .


BRE Uitzonderingen

Hoewel ERE (uitgebreide reguliere expressies) de typische syntaxis in Perl-stijl weerspiegelt, heeft BRE (standaard reguliere expressies) aanzienlijke verschillen als het gaat om ontsnappen:

  • Er is een andere syntaxis voor steno. Alle \d , \s , \w enzovoort zijn verdwenen. In plaats daarvan heeft het zijn eigen syntaxis (die POSIX verwarrend "tekenklassen" noemt), zoals [:digit:] . Deze constructen moeten binnen een tekenklasse vallen.
  • Er zijn enkele metatekens ( . , * , ^ , $ ) Die normaal kunnen worden gebruikt. ALLE andere metatekens moeten op een andere manier worden ontlopen:

Bretels {}

  • a{1,2} overeen met a{1,2} . Gebruik a\{1,2\} om te matchen met a of aa

Haakjes ()

  • (ab)\1 is ongeldig, omdat er geen abab Gebruik \(ab\)\1 om dit probleem op te lossen en te matchen.

backslash

  • Binnen char-klassen (die haakse uitdrukkingen worden genoemd in POSIX), is backslash geen metateken (en hoeft niet te worden ontsnapt). [\d] overeen met \ of d .
  • Waar dan ook, ontsnap zoals gewoonlijk.

anders

  • + en ? zijn letterlijk. Als de BRE-engine ze als metatekens ondersteunt, moeten ze worden ontsnapt als \? en \+ .

/ Delimiters /

In veel talen kan regex worden ingesloten of gescheiden tussen een paar specifieke tekens, meestal de slash / .

Scheidingstekens hebben een impact op ontsnappen: als het scheidingsteken / en de regex moet zoeken naar / literals, moet de schuine streep worden ontsnapt voordat het een letterlijke waarde kan zijn ( \/ ).

Overmatig ontsnappen schaadt de leesbaarheid, dus het is belangrijk om de beschikbare opties te overwegen:

Javascript is uniek omdat het slash als scheidingsteken toestaat, maar niets anders (hoewel het wel stringente regexes toestaat).

Perl 1

Perl staat bijvoorbeeld bijna alles toe om een scheidingsteken te zijn. Zelfs Arabische karakters:

$str =~ m ش ش

Specifieke regels worden vermeld in de documentatie van Perl .

PCRE biedt twee soorten scheidingstekens: bijpassende scheidingstekens en scheidingstekens in bracket-stijl. Overeenkomende scheidingstekens maken gebruik van het paar van een enkel karakter, terwijl scheidingstekens in haakjesstijl gebruik maken van een paar karakters die een openend en sluitend paar vertegenwoordigen.

  • Overeenkomende scheidingstekens:! !"#$%&'*+,./:;=?@^_`|~-
  • Scheidingstekens in bracketstijl: () , {} , [] , <>


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow