208 votes

Regex - Les traits d'union doivent-ils être échappés ?

Duplicata possible :
Comment faire correspondre des traits d'union avec une expression régulière ?

Le trait d'union est un caractère spécial dans les expressions rationnelles. Par exemple, pour sélectionner une plage, je pourrais faire quelque chose comme.. :

[0-9A-F]

Mais en dehors des crochets, c'est juste un caractère normal, non ? J'ai testé cela sur quelques testeurs de regex en ligne, et les traits d'union semblent fonctionner comme un caractère normal en dehors des crochets (ou même à l'intérieur des crochets s'ils ne sont pas entre deux caractères - par exemple [-g] semble correspondre à - ou g), qu'il soit échappé ou non. Je n'ai pas trouvé la réponse à cette question, mais je me demande s'il est conventionnel ou non d'échapper les traits d'union.

Merci !

5 votes

Cela dépend de la langue que vous utilisez pour représenter les expressions irrégulières.

3 votes

Voici un article similaire qui devrait répondre à vos questions : stackoverflow.com/a/4068725/56829

10 votes

Je ne vois pas en quoi c'est une copie exacte. Cette question demande COMMENT échapper aux traits d'union. Je sais déjà comment les échapper et je demande s'il est nécessaire de les échapper. Le fait que certaines des réponses se chevauchent n'est pas pertinent car la nature des questions est différente. Veuillez rouvrir le dossier.

307voto

Chris Points 3882

Correct sur tous les fronts. En dehors d'une classe de caractères (c'est ce qu'on appelle les "crochets"), le trait d'union n'a pas de signification particulière, et à l'intérieur d'une classe de caractères, vous pouvez placer un trait d'union comme premier ou dernier caractère de la plage (par exemple [-a-z] o [0-9-] ), OU l'échapper (par exemple [a-z\-0-9] ) afin d'ajouter le "trait d'union" à votre classe.

Il est plus courant de trouver un trait d'union placé en premier ou en dernier dans une classe de personnage, mais en aucun cas vous ne serez lynché par des hordes de barbus furieux pour avoir choisi de l'échapper à la place.

(En fait... d'après mon expérience, une grande partie des regex est utilisée par des personnes qui ne maîtrisent pas complètement la syntaxe. Dans ces cas, vous verrez typiquement tout ce qui est échappé (par ex. [a-z\%\$\#\@\!\-\_] ) simplement parce que l'ingénieur ne sait pas ce qui est "spécial" et ce qui ne l'est pas... alors il "joue la sécurité" et obscurcit l'expression avec des tas de antislashs excessifs. Vous vous rendrez un grand service à vous-même, à vos contemporains et à votre postérité en prenant le temps de bien comprendre la syntaxe regex avant de l'utiliser).

Excellente question !

3 votes

Un point intéressant concernant les fuites excessives de ceux qui ne comprennent pas tout et veulent "jouer la sécurité".

23 votes

+1 pour m'aider à comprendre la psyché des "hordes de barbus furieux" :D

2 votes

Une réponse très utile. Il s'avère que dans Eclipse Luna, le Linter Java se plaint si vous essayez de l'échapper.

18voto

ruakh Points 68789

En dehors des classes de caractères, il est conventionnel no pour échapper aux traits d'union. Si je voyais un trait d'union échappé en dehors d'une classe de caractères, cela me laisserait penser qu'il a été écrit par quelqu'un qui n'est pas très à l'aise avec les regex.

À l'intérieur des classes de caractères, je ne pense pas qu'une façon soit conventionnelle plutôt qu'une autre ; d'après mon expérience, c'est généralement semble être de mettre soit en premier, soit en dernier, comme dans [-._:] o [._:-] pour éviter la barre oblique inverse ; mais j'ai aussi souvent vu qu'il était échappé à la place, comme dans [._\-:] et je n'appellerais pas ça un conventionnel.

9voto

Wes Hardaker Points 10426

En règle générale, vous mettez toujours le trait d'union en premier dans le champ [] section de match. Par exemple, pour faire correspondre n'importe quel caractère alphanumérique, y compris les traits d'union (écrit dans le sens long), vous utilisez [-a-zA-Z0-9]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X