2017-08-30 1 views
2

Ich habe einen Pig Latin-Übersetzer, den ich eingerichtet habe, um Strings mit einem oder mehreren Wörtern aufzunehmen, aber keine Interpunktion.Verschieben von Satzzeichen vom Anfang oder von der Mitte einer Zeichenfolge bis zum Ende

Wie es ist, translatePigLatin("Pig Latin"); kehrt 'Igpay Atinlay', wie es sollte, aber translatePigLatin("Pig Latin."); kehrt 'Igpay Atin.lay', mit der Zeit nervig in der Mitte eines Wortes. Wie kann ich es stattdessen 'Igpay Atinlay.' zurückgeben?

Die Funktion ist:

function translatePigLatin(string) { 
    var arr = string.split(' '); 
    var str; 
    for (var i = 0; i < arr.length; i++) { 
    var j = 0; 
    if (!/[\d]/.test(arr[i])) { 
     while (/[^aeiou]/i.test(arr[i][j])) { 
     j++; 
     } 
     if (j > 0) { 
     arr[i] = arr[i].slice(j) + arr[i].slice(0, j) + 'ay'; 
     } else { 
     arr[i] = arr[i] + 'way'; 
     } 
    } 
    if (/[A-Z]/.test(arr[i])) { 
     arr[i] = toTitleCase(arr[i]); 
    } 
    } 
    return arr.join(' '); 
} 

function toTitleCase(str) { 
    return str.replace(/\w\S*/g, function(txt) { 
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 
    }); 
} 
+0

collect + Alle Nicht-Alpha-Zeichen aus der Eingabezeichenfolge entfernen und am Ende der Routine die Nicht-Alphazeichen an das Ende der Zeichenfolge anhängen. – marcusshep

+0

@marcusshep Ich denke, das ist es, was ich tun muss, aber ich habe Probleme, es richtig zu machen. – alton1231

+0

Sie haben das, ich glaube an dich. – marcusshep

Antwort

0

Sie diese Funktion nutzen zu können:

function punct(str) 
{ 
    var punctuation = ".,[email protected]#$"; 
    var matches = 0; 
    for(var i=0;i<str.length-matches;i++) 
    { 
    if(punctuation.indexOf(str[i])!=-1) 
    { 
     str = str.substr(0,i) + str.substr(i+1)+str[i--]; 
     matches++; 
    } 
    } 
    return str; 
} 

, die durch Ihre String-Schleifen einer for-Schleife, und wenn es ein Zeichen innerhalb der Zeichensetzung Zeichenfolge findet, es bewegt sich dieser Punkt am Ende des Strings.So Punct ("Igpay Atin.lay") ergibt "Igpay Atinlay.". Geben Sie es eine Chance.

+0

Perfekt. Ich danke dir sehr! Ich hatte so etwas früher gemacht, als ich das selbst versuchte, aber das, was ich hatte, war nahe genug, um noch immer eine wirklich falsche Antwort zu geben. – alton1231

+0

@ alton1231 Kein Problem.Der schwierigste Teil dieser iterativen Lösung ist, dass Sie für jedes gefundene Match neben dem Verschieben am Ende des Strings auch die Anzahl der Zeichen, die Ihre for-Schleife verarbeitet, um eins reduzieren müssen. also hast du str.length-matches.Andererseits verarbeitet deine Schleife auch die Interpunktion, die am Ende bereits übertragen wurde, was wir nicht wollen –

Verwandte Themen