2016-08-08 8 views
0

Ich bekomme derzeit die location.path URL und zeige die URL als meinen Titel, wie kann ich es Camelcase machen, wenn ich einen Titel wie "Banane und Apfel" habe ich nicht wollen, dass die "und" zu sei "Und", sondern nur zurück "Banana und Apple"Javascript Regex Camelcase

Ich fand diesen JavaScript-Code und die Rückgabe meines Titels als "Banana And Apple".

function camelize(str) { 
     return str.replace(/(?:^\w|[A-Z]|\b\w|\s+)/g, function(match, index) { 
      if (+match === 0) return " "; // or if (/\s+/.test(match)) for white spaces 
      return index == 0 ? match.toLowerCase() : match.toUpperCase(); 
     }); 
    } 

und ich bin zu ersetzen (/) und (-) als Raum

this.title = camelize(lastPartOfUrl.replace(/\/|\-/g, ' ')); 

oder

var cleanUrl = lastPartOfUrl.replace(/\/-/g, ' '); 
this.title = camelize(cleanUrl.replace(/-/g, ' ')); 
+0

Bedeutet das, dass "Banane/und/Apfel-oder-Orange" zu "Banane und Apfel oder Orange" werden sollte? – Arnauld

+0

Wie soll es wissen, dass "und" nicht großgeschrieben werden soll? Dies ist übrigens nicht "Camelcase", was sich auf Benennungsschemata für Variablen/Bezeichner bezieht. Ich denke, es würde "Wort Großschreibung" genannt werden. –

Antwort

0

String.prototype.capitalizeFirstLetter = function() { 
 
    return this.charAt(0).toUpperCase() + this.slice(1); 
 
}; 
 

 
String.prototype.toCamelCase = function() { 
 
    return this.split(" ").reduce((previousValue, currentValue, currentIndex) => (currentIndex == 1) ? 
 
    previousValue.toLowerCase() + currentValue.capitalizeFirstLetter() : 
 
    previousValue + currentValue.capitalizeFirstLetter() 
 
); 
 
}; 
 
alert("Banana And Apples".toCamelCase())

EDI T: Worte Capitalize, mit Ausnahme einer Reihe von Wörtern Klein werden:

function titleCaseExcept(value, lowerCaseArray, upperCaseArray, isCaseSensitive) { 
 
    var str = value.replace(/([^\W_]+[^\s-]*) */g, (txt) => 
 
    txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase() 
 
); 
 
    var regexFlags = (isCaseSensitive) ? 'gi' : 'g'; 
 

 
    // Lower case words 
 
    lowerCaseArray.forEach((element) => 
 
    str = str.replace(new RegExp('\\s' + element + '\\s', regexFlags), 
 
     (text) => text.toLowerCase() 
 
    ) 
 
); 
 
    
 
    // Upper case words 
 
    upperCaseArray.forEach((element) => 
 
    str = str.replace(new RegExp('\\b' + element + '\\b', regexFlags), 
 
     (text) => text.toUpperCase() 
 
    ) 
 
); 
 
     
 
    return str; 
 
} 
 

 
// Find any of these, in any case, to replace to lowercase 
 
lowers = ['A', 'an', 'THE', 'and', 'But', 'oR', 'For', 'Nor', 'As', 'At', 
 
    'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With']; 
 
// Find any of these, in any case, to replace to uppercase 
 
uppers = ['id', 'tv']; 
 

 
// Last parameter is true for case-insensitive arrays 
 
console.log(upperCaseExcept("Bananas And Apples In Some Place On Tv", lowers, uppers, true));

+0

... Ich verstehe deine Frage nicht. Sie möchten also, dass jedes zweite Wort nicht großgeschrieben wird? Oder Konjunktive, um nicht großgeschrieben zu werden? –

+0

er will 'And' durch' and' –

+0

@RolandStarke ersetzen mit einer ziemlich raffinierten Funktion. –

0

Es, dies zu tun in jeder Computersprache noch nicht kohärent ist, wenn Sie zu Nick Bull greifen Lösung oder ähnliches.

Das Problem ist, dass Computerprogramme nicht erkennen, dass "Banane" eine andere Art von Wort ist als "und" - dh: "Banane" ist ein Substantiv, "und" ist eine Konjunktion.

Sie müssen entweder Ihr Wissen über das, was in Ihrem String sein könnte (wie bei Nick Bulls Lösung), oder eine einfachere Lösung akzeptieren, bei der Sie vielleicht nur den ersten Buchstaben groß schreiben und die Konsequenzen ziehen.

(ich weiß, was ich wählen würde)

+0

Welche würden Sie wählen? – nCore

+0

Zum Teil, weil ich faul bin, zum Teil, weil jede Liste von Ausnahmewörtern, die Sie wählen, jemand einen anderen verwenden muss, würde ich einfach den ersten Buchstaben groß schreiben. "Banana and Apple" wird einen menschlichen Leser für einen Moment nicht stören - obwohl wir die Schwierigkeiten gesehen haben, die es für Programme verursacht. Also würde ich mich auf die intuitive Flexibilität der Menschen verlassen, anstatt endlos mit möglichen Kombinationen zu kämpfen. –

1

Es kürzere Lösung auf einem einzigen RegEx basiert.

function camelCase(txt){ 
    var lower='and,or,a,in,on,'; //stop-words 
    return txt //.split(/\/-/).join(' ') 
      .toLowerCase().replace(/(\b.)(\S*\b)(\s|$)/g, 
         function(m/*full match*/, 
           n/*(\b.)*/, 
           p/*(\S*\b)*/, 
           q/*(\s|$)*/){ 
         //console.log(n,p); 
         return (lower.indexOf(n+p+',')===-1? 
          n.toUpperCase() : n) + p + q;}); 
} 
+0

Das scheint in Ordnung und kürzer zu funktionieren, ich bekomme den txt Kommentar nicht zurück. Gibt es eine Möglichkeit, "/" zu entfernen und "-" als Leerzeichen in der Funktion zu ersetzen? also muss ich es nicht separat machen? – nCore

+0

Kommentar auskommentieren // split (/ \/- /). Join ('') '. Das ist alles. –