Barre oblique – Expression régulière – Javascript

Je voulais construire une fonction JS en accordant une liste d'arguments à un chemin valide (car je ne pouvais pas être sûr si une partie du chemin est donnée avec ou sans barres obliques)

C'est la fonction:

concatPath = function() { var path = ""; for(var i = 0; i < arguments.length; i++) { path += arguments[i].replace("(\\|/)$|^(\\|/)", "") + "/"; } return path; } 

Le RegEx utilisé correspond à tous les blocs de début et de fin et des barres obliques sur http://regexpal.com. Mais la fonction ne fonctionne pas correctement (RegEx ne correspond pas). En outre, les états de Chrome

SyntaxError: expression régulière invalide: / () $ | ^ () /: groupe non terminé

Quand j'utilise juste le RegEx

  (\\)$|^(\\) 

Cependant, en utilisant le RegEx

  (\\)$|^(\\) 

Fonctionne bien.

Est-il trop tard ou est-ce que j'ai manqué quelque chose de spécial?

Merci d'avance!

Leo

Vous devriez utiliser un littéral d'expression régulière ( /.../ ) au lieu d'un littéral de chaîne ( '...' ou "..." ) dans l'appel à replace . Les cordes ont leur propre interprétation des barres obliques qui débutera avant que le constructeur d'expression régulière ne se fasse craquer, donc vous avez besoin d'un niveau supplémentaire de citations.

Correspond à une barre oblique inverse, expression régulière: /\\/

Correspond à une barre oblique inverse, expression régulière dans une chaîne: '\\\\'

Mais dans un littéral regex, vous devez également mettre des barreaux arrière devant les barreaux avant, car les barres obliques sont le délimiteur pour l'ensemble:

 path += arguments[i].replace(/(\\|\/)$|^(\\|\/)/, "") + "/"; 

Ou, si vous êtes marié à l'utilisation de cordes pour une raison quelconque, cela devrait également fonctionner:

 path += arguments[i].replace("(\\\\|/)$|^(\\\\|/)", "") + "/"; 

En tant que note latérale, lorsque vos alternatives sont des caractères uniques, (x|y) est génial; Vous pouvez simplement utiliser des classes de caractères: [xy] . Dans ce cas, vous obtenez ceci:

 path += arguments[i].replace(/[\\\/]$|^[\\\/]/, "") + "/"; path += arguments[i].replace("[\\\\/]$|^[\\\\/]", "") + "/"; 

Essayez ceci … c'est un peu plus facile à suivre avec les [classes de personnage]. Pour correspondre à un seul \ avec une chaîne javascript dont vous avez besoin \\\\ , ce qui peut être ce qui se passe.

new Regexp('^[\\\\/]|[\\\\/]$')

Vous pouvez également essayer la notation /^[\\\/]|[\\\/]$/g .

 s = 'c:\\folder\\' console.log(s.replace(/^[\\\/]|[\\\/]$/g, ''))