2016-09-05 1 views
0

Ich versuche, eine Zeichenfolge von ungültigen Zeichen zu löschen, um als ein Verzeichnis festgelegt werden. Versuchte eine Reihe von Methoden und diese schließlich funktioniert [benutzerdefinierte Codierung], aber jetzt ist es nicht, es sagt "nichts zu wiederholen" in der Konsole. Was bedeutet das? mit Chrome.Javascript Regex Fehler "/? /: Nichts zu wiederholen" Es funktionierte gut früher

Hier ist der Code (mit zufälligen Zeichenfolge):

var someTitle = "wa?"; 
var cleanTitle = cleanTitle(someTitle); 

function cleanTitle(title){ 

    var obstructions = ['\\','/',':','*','?','"','<','>','|']; 
    var solutions = [92,47,58,42,63,34,60,62,124]; 
    var encodedTitle = title; 

    for (var obstruction = 0; obstruction < obstructions.length; obstruction++){ 
      var char = obstructions[obstruction]; 

      if (encodedTitle.includes(char)){ 
       var enCode = "__i!__"+solutions[obstruction]+"__!i__"; 
       var rEx = new RegExp(char,"g"); 
       encodedTitle = encodedTitle.replace(rEx,enCode); 
      } 
    } 

    console.log("CLEAN: "+title); 
    console.log("ENCODED: "+encodedTitle); 


    return encodedTitle; 
} 

Heres der Fehler:

Uncaught SyntaxError: Invalid regular expression: /?/: Nothing to repeat

Es weist auf dieser Linie ->var rEx = new RegExp(char,"g");

Antwort

1

Sie müssen einige Zeichen entkommen, wenn sie als Literale in einem regulären Ausdruck. Unter diesen sind die meisten Charaktere, die Sie in Ihrem Array haben.

Wenn Ihre Funktion die Hinderniszeichen durch ihren ASCII-Code ersetzt (und einige Umrisse __i!__), würde ich vorschlagen, Ihre Funktion etwas übersichtlicher zu gestalten, indem Sie die Ersetzung mit einem regulären Ausdruck durchführen und einen Rückruf an .replace() übergeben:

function cleanTitle(title){ 
 
    return title.replace(/[\\/:*?"<>|]/g, function (ch) { 
 
     return "__i!__"+ch.charCodeAt(0)+"__!i__"; 
 
    }); 
 
} 
 

 
var someTitle = "wh*r* is |his?"; 
 
var result = cleanTitle(someTitle); 
 

 
console.log(result);

... und wenn Sie in einer ES6 kompatibelen Umgebung sind:

var cleanTitle = t=>t.replace(/[\\/:*?"<>|]/g, c=>"__i!__"+c.charCodeAt(0)+"__!i__"); 
 

 
var someTitle = "wh*r* is |his?"; 
 
var result = cleanTitle(someTitle); 
 

 
console.log(result);

0

Die ? ist ein Regex Modifikator. Wenn du danach suchen willst (und eine Regex damit erstellen willst), musst du entkommen. Das gesagt wird, ein harmloses, unpassendes Entweichen tut nicht weh (oder macht Ihre anderen Suchparameter brauchbar, da es viele Modifikatoren oder reservierte Zeichen darin gibt) Ihre anderen Suchparameter. So gehen Sie mit

var char = '\\' + obstructions[obstruction]; 

sie alle mit einem (für die reguläre Ausdrücke) String-Darstellung zu ersetzen

+0

, die nicht helfen, es hat funktioniert besser, es in dieser Zeile setzen: var rEx = new RegExp ('\\' + char, "g"); –

+0

Ah, mir war deine 'if' Aussage egal @LlamaObama – baao

0

/?/ ist keine gültige regex. Damit es eine Regex ist, benötigen Sie /\?/.

Regex wäre hier peinlich, da die meisten Charaktere entkommen müssen. Stattdessen sollten Sie eine Zeichenkette Ersatz verwenden, bis er nicht mehr gefunden:

while(encodedTitle.indexOf(char) > -1) { 
    encodedTitle = encodedTitle.replace(char,enCode); 
} 
+0

Danke! es funktioniert!! –

Verwandte Themen