web-dev-qa-db-fra.com

L'expression régulière JavaScript avec des barres obliques d'échappement ne remplace pas

Dois-je échapper les barres obliques lors de leur expression régulière?

myString = '/courses/test/user';
myString.replace(/\/courses\/([^\/]*)\/.*/, "$1");
document.write(myString);

Au lieu d'imprimer "test", il imprime la chaîne source entière.

Voir cette démo:

http://jsbin.com/esaro3/2/edit

33
Radek Simko

Votre expression régulière est parfaite, et oui, vous devez échapper aux barres obliques car JavaScript utilise les barres obliques pour indiquer les expressions rationnelles.

Cependant, le problème est que la méthode replace de JavaScript n'effectue pas de remplacement sur place. Autrement dit, il ne change pas réellement la chaîne - il vous donne juste le résultat du remplacement.

Essaye ça:

myString = '/courses/test/user';
myString = myString.replace(/\/courses\/([^\/]*)\/.*/, "$1");
document.write(myString);

Cela définit myString sur la valeur remplacée.

43
Reid

/[\/]/g correspond aux barres obliques.
/[\\]/g correspond à des barres obliques inverses.

12
rajesh_kw

string.replace ne modifie pas la chaîne d'origine. A la place, a renvoie une nouvelle chaîne dont le remplacement a été effectué.

Essayer:

myString = '/courses/test/user';
document.write(myString.replace(/\/courses\/([^\/]*)\/.*/, "$1"));
9
Anon.

En fait, vous n'avez pas besoin d'échapper à la barre oblique lorsque vous êtes dans une classe de caractères comme dans une partie de votre exemple (c'est-à-dire [^\/]* c'est bien comme juste [^/]*). S'il est en dehors d'une classe de caractères (comme avec le reste de votre exemple tel que \/courses), vous devez alors échapper aux barres obliques.

9
Brett Zamir