2017-10-11 2 views
0

Ich habe unten Funktion geschrieben Raum mit Bindestrich zu konvertieren oderRegex einzelne oder mehrere Vorkommen von Bindestrich zu ersetzen

  1. Raum umgekehrt mit Bindestrich str.trim().replace(/\s+/g, '-')
  2. Bindestrich mit Platz str.replace(/\-/g,' ')

Aber jetzt bin Ich versuche, einen einzelnen Bindestrich durch einen doppelten Bindestrich zu ersetzen. Ich kann die Funktion Punkt 1 nicht verwenden, weil sie ein einzelnes/mehrfaches Vorkommen anstelle von einfachem konvertieren.

Gibt es eine Möglichkeit regex zu schreiben, die in einzelner Formel-3-Betrieb tun

  1. convert Schrägstrich mit Strich replace(/\//g, '_')
  2. convert Raum mit Bindestrich
  3. konvertieren einzelnen Bindestrich mit mehrere Bindestrich

zB regex 1 Änderung

"Name/Er-Gourav Mukhija" into "Name_Er--Gourav-Mukhija" 

regex 2 haben es umgekehrt.

Antwort

0

Es ist nicht möglich, eine Regex Formel zu schreiben, die bedingte Ersetzungen bedeutet (dh a-> b, c-> d). Ich würde stattdessen versuchen, zwei Anweisungen zu erstellen, um "" -> "-" und "/" -> "_" zu ersetzen.

Sie können Ihre vorhandenen Code für beide Operationen verwenden. Ich würde empfehlen, this site für das Bauen und Testen von Regexen in der Zukunft zu verwenden.

+0

Regexr hat einige Probleme mit der Javascript Regexp-Version. Besser nutzen [regex101] (https://regex101.com) – lumio

4

Sie könnten eine Callback-Funktion anstelle einer ersetzen Zeichenfolge verwenden. Auf diese Weise können Sie alle Zeichen gleichzeitig angeben und ersetzen.

const input = 'Name/Er-Gourav Mukhija'; 
 
const translate = { 
 
    '/': '_', 
 
    '-': '--', 
 
    ' ': '-', 
 
}; 
 
const reverse = { 
 
    '_': '/', 
 
    '--': '-', 
 
    '-': ' ', 
 
}; 
 

 
// This is just a helper function that takes 
 
// the input string, the regex and the object 
 
// to translate snippets. 
 
function replaceWithObject(input, regex, translationObj) { 
 
    return input.replace(regex, function(match) { 
 
    return translationObj[ match ] ? translationObj[ match ] : match; 
 
    }); 
 
} 
 

 
function convertString(input) { 
 
    // Search for /, - and spaces 
 
    return replaceWithObject(input, /(\/|\-|\s)/g, translate); 
 
} 
 

 
function reverseConvertedString(input) { 
 
    // Search for _, -- and - (the order here is very important!) 
 
    return replaceWithObject(input, /(_|\-\-|\-)/g, reverse); 
 
} 
 

 
const result = convertString(input); 
 
console.log(result); 
 
console.log(reverseConvertedString(result));

0

Betrachten var str = "Name/Er-Gourav Mukhija"

  1. vorwärts mit Strich Schrägstrich zu konvertieren, wie Sie verwenden erwähnt replace(/\//g, '_')
  2. Um Platz mit Bindestrich zu konvertieren, verwenden replace(/\s+/g, '-')
  3. zu konvertieren Einfacher Bindestrich zum doppelten Bindestrich, verwenden replace(/\-/g, '--').

Alle diese 3 können kombiniert werden zu:

str.replace(/\//g, '_').replace(/\s+/g, '-').replace(/\-/g, '--')

0

Sie eine Schleife verwenden, sollten alle auf einmal zu tun:

str = str.split(""); 
var newStr = ""; 
str.forEach(function (curChar) { 
    switch(curChar) { 
    case " ": 
     newStr += "-"; 
     break; 
    case "/": 
     newStr += "_"; 
     break; 
    case "-": 
     newStr += "--"; 
     break; 
    default: 
     newStr += curChar; 
    } 
}); 
str = newStr; 

Fühlen Sie sich frei drehen diese in eine Funktion, wenn du magst. Ich habe es auch nicht umgekehrt gemacht, aber alles, was Sie tun müssen, ist, die Zuordnungszeichenfolgen durch die Zeichenfolgen in der Anweisung switch() zu ersetzen.

Es gibt keine Möglichkeit, alles mit Regex zu tun, da Ihre spätere Regex Ihre erste Regex in mindestens einem Fall überschreibt, egal wie Sie es schreiben.

Verwandte Themen