Faire correspondre une barre oblique avec une expression régulière


90

Je n'ai pas beaucoup d'expérience avec JavaScript mais j'essaie de créer un système de balises qui, au lieu d'utiliser @ou #, utiliserait /.

var start = /#/ig; // @ Match

var word = /#(\w+)/ig; //@abc Match

Comment pourrais-je utiliser un /au lieu du #. J'ai essayé de faire var slash = '/'et d'ajouter + slash +, mais cela a échoué.


1
Veuillez changer le titre. Et qu'essayez-vous vraiment de faire? Je n'ai toujours aucune idée après avoir lu votre question.
OptimusCrime

Je ne suis pas sûr de comprendre.
John Strickler

Réponses:


123

Vous pouvez y échapper comme ça.

/\//ig; //  Matches /

ou utilisez simplement indexOf

if(str.indexOf("/") > -1)

Merci Ben, j'ai essayé ça aussi mais j'ai ajouté un autre \ à la fin.
iBrazilian2

21

Vous devez vous échapper /avec un \.

/\//ig // matches /

6

Si vous souhaitez l'utiliser, /vous devez y échapper avec un\

var word = /\/(\w+)/ig;

6

Dans les expressions régulières, "/" est un caractère spécial qui doit être échappé (AKA marqué en plaçant un \ avant, annulant ainsi toute fonction spécialisée qu'il pourrait servir).

Voici ce dont vous avez besoin:

var word = /\/(\w+)/ig; //   /abc Match

Renseignez-vous sur les caractères spéciaux RegEx ici: http://www.regular-expressions.info/characters.html


17
"/" n'est pas un caractère spécial dans les expressions régulières. C'est cependant un caractère spécial en JavaScript qui délimite le début et la fin de l'expression régulière.
sokkyoku

5

Vous pouvez également contourner la gestion JS spéciale de la barre oblique en la plaçant dans un groupe de caractères, comme ceci:

const start = /[/]/g;
"/dev/null".match(start)     // => ["/", "/"]

const word = /[/](\w+)/ig;
"/dev/null".match(word)      // => ["/dev", "/null"]

2
+1, l'utilisation d'un jeu de caractères pour éviter l'échappement allonge le caractère RegEx d'un seul caractère, mais cela en vaut la peine pour la lisibilité: /[/]/différencie visuellement le délimiteur de fin plus clairement que /\//.
Dem Pilafian

2
/[/]/est plus facile à lire et fonctionne, mais malheureusement, certains validateurs RegEx rapporteront "Un délimiteur non échappé doit être échappé avec une barre oblique inverse" même dans un groupe de caractères . Donc, je suis revenu à la /\//forme laide .
Dem Pilafian


1

Pour moi, j'essayais de faire correspondre le /dans une date en C #. Je l'ai fait simplement en utilisant (\/):

string pattern = "([0-9])([0-9])?(\/)([0-9])([0-9])?(\/)(\d{4})";
string text = "Start Date: 4/1/2018";

Match m = Regex.Match(text, pattern);

if (m.Success) 
{ 
    Console.WriteLine(match.Groups[0].Value);  // 4/1/2018
}
else
{
    Console.WriteLine("Not Found!");
}

JavaScript devrait également pouvoir utiliser de la même manière (\/).


Downvoter, voulez-vous expliquer? Cela fonctionne et je l'ai prouvé en le testant.
vapcguy

1
Je pense que c'était un accident, désolé. J'ai essayé de l'annuler, mais il indique que mon vote est verrouillé à moins que la réponse ne soit modifiée. La seule chose que je vois, c'est que vous avez un journal de capture de groupes que vous ne semblez pas utiliser. Une raison pour laquelle tout est entre parenthèses?
Ryan Quinn

1
@RyanQuinn Merci pour l'explication. J'ai utilisé des parenthèses pour regrouper les choses afin de représenter un chiffre particulier auquel je m'attendais. Il semblait également en avoir besoin sur un site que j'utilisais pour le tester: regexr.com J'ai édité mon message (je viens d'ajouter un espace à la fin), vous devriez donc pouvoir supprimer le vote négatif si vous le souhaitez.
vapcguy

0

J'ai rencontré deux problèmes liés à ce qui précède, lors de l'extraction de texte délimité par \et /, et j'ai trouvé une solution qui convient aux deux, autre que l'utilisation new RegExp, ce qui nécessite \\\\au début. Ces résultats sont dans Chrome et IE11.

L'expression régulière

/\\(.*)\//g

ne marche pas. Je pense que le //est interprété comme le début d'un commentaire malgré le caractère d'échappement. L'expression régulière (également valable dans mon cas mais pas en général)

/\b/\\(.*)\/\b/g

ne fonctionne pas non plus. Je pense que la seconde /met fin à l'expression régulière malgré le caractère d'échappement.

Ce qui fonctionne pour moi, c'est de représenter /comme \x2F, qui est la représentation hexadécimale de /. Je pense que c'est plus efficace et compréhensible que l'utilisation new RegExp, mais bien sûr, il faut un commentaire pour identifier le code hexadécimal.


0

La barre oblique est un caractère spécial, vous devez donc ajouter une barre oblique inverse avant la barre oblique pour que cela fonctionne

$patterm = "/[0-9]{2}+(?:-|.|\/)+[a-zA-Z]{3}+(?:-|.|\/)+[0-9]{4}/";

où / représente la recherche de / De cette façon, vous

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.