Backslashes – Expressão Regular – Javascript

Eu queria construir uma function JS concatenando uma lista de argumentos para um caminho válido (desde que eu não podia ter certeza se uma parte do caminho é dada com ou sem barras)

Esta é a function:

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

O RegEx usado combinou todas as barras iniciais e finais e barras invertidas em http://regexpal.com Mas a function não funciona corretamente (RegEx não corresponde). Além disso, os estados do Chrome

SyntaxError: Expressão regular inválida: / () $ | ^ () /: grupo não terminado

quando eu apenas uso o RegEx

  (\\)$|^(\\) 

No entanto, usando o RegEx

  (\\)$|^(\\) 

funciona bem.

É tarde demais ou perdi algo especial?

Desde já, obrigado!

Leo

Você deve usar um literal de expressão regular ( /.../ ) em vez de um literal de cadeia ( '...' ou "..." ) na chamada a ser replace . As strings têm sua própria interpretação de barras invertidas que são ativadas antes que o construtor de expressão regular seja burlado, portanto, você precisa de um nível extra de citações.

Corresponde a uma barra invertida, literal de expressão regular: /\\/

Corresponder a uma barra invertida, expressão regular em uma string: '\\\\'

Mas em um literal de regex, você também deve colocar barras invertidas na frente das barras, já que as barras são o delimitador para a coisa toda:

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

Ou, se você é casado com o uso de strings por algum motivo, isso também deve funcionar:

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

Como uma nota secundária, quando suas alternativas são caracteres únicos, (x|y) é exagerado; você pode apenas usar classs de personagem: [xy] . Em qual caso você adquire isto:

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

Tente isso … é um pouco mais fácil de seguir com as [classs de personagens]. para combinar com um único \ com uma string de javascript que você precisa \\\\ , que pode ser o que está acontecendo.

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

Você também pode tentar a notação /^[\\\/]|[\\\/]$/g .

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