2015-10-31 8 views
7

ho definito una funzione in JavaScript che sostituire tutte -, _, @, #, $ e \ (sono possibili separatori) con / (separatore valido).JavaScript - Qual è il modo corretto per sostituire "" Charcter con "/" in RegExp

Il mio obiettivo è qualsiasi stringa come "1394_ib_01#13568" convertire "1394/ib/01/13568"

function replaceCharacters(input) { 

    pattern_string = "-|_|@|#|$|\u005C";  // using character Unicode 
    //pattern_string = "-|_|@|#|$|\";   // using original character 
    //pattern_string = "-|_|@|#|$|\\";  // using "\\" 
    //pattern_string = "\|-|_|@|#|$";   // reposition in middle or start of string 
    pattern = new RegExp(pattern_string, "gi"); 

    input = input.replace(pattern, "/"); 
    return input; 
} 

mio problema è quando una stringa con \ carattere inviare a funzionare risultato non è valido.

Ho provato a utilizzare Unicode di \ nel modello di definizione, oppure utilizzare \\\ anziché. Inoltre ho sostituito la posizione di esso nella stringa del modello. Ma in ogni di questa situazione, problema non è stato risolto e il browser tornare risultato non valido o errore diverso come ad esempio:

SyntaxError: unterminated parenthetical ---> in using "\u005C" 
SyntaxError: \ at end of pattern   ---> in using "\\" 
Invalid Result: broken result in 2 Line or replace with undefined character based on input string (the character after "\" determine result) 
         ---> in reposition it in middle or start of pattern string 
+0

Puoi fornire un esempio di input e un esempio di cosa ti aspetti come risultato ?? Non è chiaro cosa si passa alla funzione * replaceCharacters * ... ex: input: 'hello world'; output: 'addio mondo' – Hitmands

+0

Caro Mr/Mrs [@Hitmands] (http://stackoverflow.com/users/4099454/hitmands), invio '' nomeelenco # nome oggetto @ 1394 \ 02 \ 01-codeID "' invia funzionare. Mi aspetto che la funzione restituisca '" nome categoria/nome oggetto/1394/02/01/codiceID "'. –

risposta

8
var pattern_string = "-|_|@|#|\\$|\\\\"; 

Dovete fuggire la barra una volta per il modello, in modo che cercherà di corrispondere al carattere letterale:

\\ 

Poi, fuga ogni barra di nuovo per la stringa letterale:

"\\\\" 

anche n ota che ho aggiunto una via di fuga per il $. Per far corrispondere letteralmente un simbolo di dollaro, sarà necessario eseguire anche l'escape, poiché normalmente rappresenta uno anchor per la "fine della linea/stringa".


È possibile anche utilizzare un Regex literal per evitare la stringa, utilizzando solo il sequenze di escape necessaria per il modello:

var pattern = /-|_|@|#|\$|\\/gi; 

E, come si sta corrispondenti solo singoli caratteri, è possibile utilizzare un character class invece di alternation:

var pattern = /[[email protected]#\$\\]/gi; 

(Basta essere attenti con il posizionamento del - qui Va bene come il primo cap. aracter nella classe, ma può rappresentare un intervallo di caratteri quando collocato nel mezzo. Puoi anche scappare per assicurarti che non rappresenti un intervallo.)

+0

Mr [@Jonathan Lonowski] (http://stackoverflow.com/users/15031/jonathan-lonowski), grazie per la vostra attenzione. Ho sostituito la tua soluzione con il mio codice. E chiama la funzione con '" categoryname # objectname @ 1394 \ 02 \ 01-codeID "' di nuovo. Mi aspetto che la funzione restituisca '" nome categoria/nome oggetto/1394/02/01/codiceID "'.Ma il risultato è '" nome categoria/nome oggetto/1394/codiceID " ' –

+0

La mia colpa è che invio stringa 'nome categoria # nomeoggetto @ 1394 \ 02 \ 01-codeID', che è un input errato. In JavaScript, quando voglio la funzione di chiamata con stringa di parametri diretta, devo inviare 'categoryname # nomeoggetto @ 1394 \\ 02 \\ 01-codeID' per funzionare. Perché il primo ''\' 'significa che il prossimo carattere è un carattere speciale. Quindi la sequenza di ''\\'' nella mia stringa di input significa solo un ''\''. –

Problemi correlati