Recherche…


Littéraux bruts

Il est préférable pour la lisibilité (et votre santé mentale) d'éviter de fuir les fuites. C'est là que les littéraux de chaînes brutes entrent en jeu. (Notez que certaines langues autorisent les délimiteurs, qui sont préférables aux chaînes de caractères. Mais c'est une autre section.)

Ils fonctionnent généralement de la même manière que cette réponse décrit :

[A] backslash, \ , est considéré comme signifiant "juste une barre oblique inverse" (sauf quand il vient juste avant une citation qui terminerait le littéral) - pas de "séquences d'échappement" pour représenter les nouvelles lignes, les tabulations, les backspaces, les flux , etc.

Toutes les langues ne les ont pas et celles qui utilisent une syntaxe variable. C # les appelle réellement littéraux littéraux , mais c'est la même chose.


Python

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

C ++ (11+)

La syntaxe ici est extrêmement polyvalente. La seule règle consiste à utiliser un délimiteur qui n'apparaît nulle part dans le regex. Si vous faites cela, aucune fuite supplémentaire n'est nécessaire pour rien dans la chaîne. Notez que les parenthèses () ne font pas partie de l'expression rationnelle:

pattern = R"delimiter(regex)delimiter";

VB.NET

Utilisez simplement une chaîne normale. Les barres obliques inverses sont TOUJOURS littérales .

C #

pattern = @"regex";

Notez que cette syntaxe autorise également "" (deux guillemets) comme une forme échappée de " .

Cordes

Dans la plupart des langages de programmation, pour obtenir une barre oblique inverse dans une chaîne générée à partir d'un littéral de chaîne, chaque barre oblique inverse doit être doublée dans le littéral de chaîne. Sinon, il sera interprété comme une évasion pour le prochain caractère.

Malheureusement, toute barre oblique inverse requise par l'expression rationnelle doit être une barre oblique inverse littérale. C'est pourquoi il devient nécessaire d'avoir des "échappements" ( \\ ) lorsque des expressions rationnelles sont générées à partir de littéraux de chaîne.

De plus, les guillemets ( " ou ' ) dans le littéral de chaîne peuvent devoir être échappés, en fonction de ce qui entoure le littéral de chaîne. Dans certaines langues, il est possible d'utiliser l'un ou l'autre style de guillemets pour une chaîne échapper à toute la chaîne littérale).

Dans certaines langues (par exemple: Java <= 7), les expressions rationnelles ne peuvent pas être exprimées directement en tant que littéraux tels que /\w/ ; ils doivent être générés à partir de chaînes, et normalement les littéraux de chaîne sont utilisés - dans ce cas, "\\w" . Dans ces cas, les caractères littéraux tels que les guillemets, les barres obliques inverses, etc. doivent être échappés. La manière la plus simple d'y parvenir est d'utiliser un outil (comme RegexPlanet ). Cet outil spécifique est conçu pour Java, mais il fonctionnera pour tout langage avec une syntaxe de chaîne similaire.

Quels personnages doivent être échappés?

L'échappement de caractères est ce qui permet de rechercher littéralement certains caractères (réservés par le moteur de regex pour la manipulation des recherches) dans la chaîne d'entrée. L'échappée dépend du contexte. Par conséquent, cet exemple ne couvre pas les chaînes ou les délimiteurs qui s'échappent.

Des backslashes

Dire que la barre oblique inverse est le caractère "évasion" est un peu trompeur. Le backslash s'échappe et le backslash apporte; il active ou désactive le métacaractère et le statut littéral du personnage qui le précède.

Pour utiliser un backslash littéral n'importe où dans une regex, il doit être échappé par une autre barre oblique inverse.

S'échapper (en dehors des classes de caractères)

Plusieurs caractères doivent être échappés pour être pris à la lettre (au moins en dehors des classes de caractères):

  • Supports: []
  • Parenthèses: ()
  • Accolades: {}
  • Opérateurs: * , + ? , |
  • Ancres: ^ , $
  • Autres: . , \
  • Pour utiliser un littéral ^ au début ou un littéral $ à la fin d'une expression régulière, le caractère doit être échappé.
  • Certaines saveurs n'utilisent que ^ et $ comme métacaractères respectivement au début ou à la fin de l'expression rationnelle. Dans ces saveurs, aucune fuite supplémentaire n'est nécessaire. En général, il vaut mieux y échapper.

S'échapper dans les classes de personnages

  • Il est préférable d'échapper aux crochets ( [ et ] ) lorsqu'ils apparaissent comme des littéraux dans une classe de caractères. Sous certaines conditions, cela n'est pas nécessaire, en fonction de la saveur , mais cela nuit à la lisibilité.
  • Le caret, ^ , est un méta lorsqu'il est placé en tant que premier caractère dans une classe de caractères: [^aeiou] . Partout ailleurs dans la classe char, c'est juste un caractère littéral.
  • Le tiret, - , est un caractère méta, sauf s'il est au début ou à la fin d'une classe de caractères. Si le premier caractère de la classe char est un caret ^ , alors ce sera un littéral si c'est le deuxième caractère de la classe char.

Échapper au remplacement

Il y a aussi des règles pour échapper au remplacement, mais aucune des règles ci-dessus ne s'applique. Les seuls métacaractères sont $ et \ , du moins lorsque $ peut être utilisé pour référencer des groupes de capture (comme $1 pour le groupe 1). Pour utiliser un littéral $ , échappez-y: \$5.00 . De même \ : C:\\Program Files\\ .


Exceptions BRE

Alors que ERE (expressions régulières étendues) reflète la syntaxe typique de Perl, BRE (expressions régulières de base) présente des différences significatives en matière d’échappée:

  • Il existe une syntaxe abrégée différente. Tous les \d , \s , \w et ainsi de suite ont disparu. Au lieu de cela, il a sa propre syntaxe (que POSIX appelle confusément "classes de caractères"), comme [:digit:] . Ces constructions doivent être dans une classe de caractères.
  • Il y a peu de métacaractères ( . , * , ^ , $ ) Qui peuvent être utilisés normalement. TOUS les autres métacaractères doivent être échappés différemment:

Bretelles {}

  • a{1,2} correspond a{1,2} . Pour faire correspondre a ou aa , utilisez a\{1,2\}

Parenthèses ()

  • (ab)\1 n'est pas valide, car il n'y a pas de groupe de capture 1. Pour le réparer et faire correspondre abab utilisez \(ab\)\1

Barre oblique inverse

  • À l'intérieur des classes de caractères (appelées expressions de parenthèses dans POSIX), la barre oblique inverse n'est pas un métacaractère (et n'a pas besoin d'être échappé). [\d] correspond à \ ou à d .
  • Partout ailleurs, échappez-vous comme d'habitude.

Autre

  • + et ? sont des littéraux. Si le moteur BRE les prend en charge en tant que métacaractères, ils doivent être échappés en tant que \? et \+ .

/ Délimiteurs /

De nombreuses langues permettent à l'expression régulière d'être délimitée ou délimitée entre deux caractères spécifiques, généralement la barre oblique / .

Les délimiteurs ont un impact sur les échappements: si le délimiteur est / et que l'expression rationnelle doit chercher / littéraux, la barre oblique doit être échappée avant de pouvoir être un littéral ( \/ ).

La fuite excessive nuit à la lisibilité, il est donc important de considérer les options disponibles:

Le javascript est unique car il permet d'utiliser une barre oblique comme délimiteur, mais rien d'autre (bien qu'il autorise les expressions rationnelles ).

Perl 1

Perl, par exemple, permet presque n'importe quoi d'être un délimiteur. Même les caractères arabes:

$str =~ m ش ش

Des règles spécifiques sont mentionnées dans la documentation de Perl .

PCRE autorise deux types de délimiteurs: les délimiteurs appariés et les délimiteurs de style crochet. Les délimiteurs appariés utilisent la paire d'un seul personnage, tandis que les délimiteurs de style crochet utilisent un couple de caractères qui représente une paire d'ouverture et de fermeture.

  • Délimiteurs correspondants:! !"#$%&'*+,./:;=?@^_`|~-
  • Délimiteurs de style crochets: () , {} , [] , <>


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow