2016-07-09 12 views
0

ein code:regexp ersetzen Funktion falsches Ergebnis in Javascript

'fontSize'.replace(/(.?)([A-Z])/g, function (m, p, z) { 
    return p == '\\' ? z : p + '-' + z.toLowerCase() 
}) 

Es ist S ersetzen mit -s, aber für die Eingabe fontSBCize das Ergebnis wird font-sB-cize, die gerade Zahl obere Brief immer nicht geändert.

Was ist hier falsch? Irgendeine Lösung für dieses Problem?

Kurz gesagt, das Ergebnis Testfall:

Test bestanden: fontSBCize =>font-s-b-cize

Test bestanden: font\\S\\B\\Cize =>fontSBCize

Test bestanden: font\\SBCize =>fontS-b-cize

+0

Was möchten Sie als Ergebnis für "fontSBCize" -> "font-sbcize"? –

+0

@rparree, siehe oben den aktualisierten Testfall. –

Antwort

0

Wenn Wenn Sie camelCase in Snake-Case konvertieren möchten, verwenden Sie dies (es werden folgende Zeichen unterstützt):

str.replace(/\\?([A-Z])/g, function($0, $1) { 
    return $1 === $0 ? "-"+$1.toLowerCase() : $1; 
}); 

Demo:

console.log('font\\SBCsize'.replace(/\\?([A-Z])/g, function($0, $1) { 
 
    return $1 === $0 ? "-"+$1.toLowerCase() : $1; 
 
})) 
 

 
console.log('font\\S\\B\\Csize'.replace(/\\?([A-Z])/g, function($0, $1) { 
 
    return $1 === $0 ? "-"+$1.toLowerCase() : $1; 
 
})) 
 

 
console.log('fontSBCsize'.replace(/\\?([A-Z])/g, function($0, $1) { 
 
    return $1 === $0 ? "-"+$1.toLowerCase() : $1; 
 
}))

+0

Vielen Dank für die schnelle Antwort, siehe den Testfall oben, die Notwendigkeit ist auch Fähigkeit ** zu entkommen ** die ersetzen, mit '\\' in Javascript String. –

+0

Bitte überprüfen Sie die aktualisierte Antwort –

0

Sie müssen sich für Escape-Zeichen berücksichtigen (überprüfen Sie die Zeichencode, der 92 ist)

function replacer(input) { 
 
    return input.replace(/[\\]*[A-Z]/g, function(m) { 
 
    return m.charCodeAt() != 92 ? "-" + m.toLowerCase() : m.substring(1); 
 
    }); 
 
} 
 

 
console.log(replacer("fontSBCize")); 
 
console.log(replacer("font\\S\\B\\Cize")); 
 
console.log(replacer("font\\SBCize"));

0

Oh, habe ich die Lösung unter dem Ergibt den Testfall bestanden:

'fontSDCize'.replace(/(.?)([A-Z])/g, function (m, p, z) { 
    return p == '\\' 
    ? z 
    : (/[A-Z]/.test(p) ? '-'+p.toLowerCase() : p) + '-' + z.toLowerCase() 
}) 

Vielleicht gibt es einen besseren Weg? Verbesserung willkommen!

0

Sie könnten die Zeichenfolge aufteilen und jedes Zeichen verarbeiten.

function replace(s) { 
 
    return s.split('').map(function (a, i, aa) { 
 
     return a === '\\' ? 
 
      '' : 
 
      aa[i - 1] === '\\' || a === a.toLowerCase() ? 
 
       a : 
 
       '-' + a.toLowerCase(); 
 
    }).join(''); 
 
} 
 

 
console.log(replace('fontSize')); 
 
console.log(replace('fontSBCize')); 
 
console.log(replace('font\\S\\B\\Cize')); 
 
console.log(replace('font\\SBCize'));