2017-08-30 67 views
2

我已經設置了一個Pig Latin拉丁轉換程序,可以設置單個或多個字符串,但不能標點符號。如何從字符串的開頭或中間移動標點符號到結尾

正因爲如此,translatePigLatin("Pig Latin");返回'Igpay Atinlay',因爲它應該,但translatePigLatin("Pig Latin.");回報'Igpay Atin.lay',在一個單詞中間煩人的時期。我如何讓它返回'Igpay Atinlay.'

功能是:

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 +從輸入字符串中刪除所有非alpha字符,然後在例程的末尾追加那些非alpha字符到字符串末尾。 – marcusshep

+0

@marcusshep我不明白這就是我需要做的,但我在正確地做到這一點時遇到了麻煩。 – alton1231

+0

你明白了,我相信你。 – marcusshep

回答

0

您可以使用此功能:

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; 
} 

它通過你的字符串循環使用for循環,如果找到標點字符串中的字符,它的動作那個字符在字符串末尾。所以點(「Igpay Atin.lay」)會產生「Igpay Atinlay」。給它一個鏡頭。

+0

完美。非常感謝!當我嘗試自己做這件事時,我曾經做過這樣的事情,但我所做的只是足夠接近,仍然給出了一個非常錯誤的答案。 – alton1231

+0

@ alton1231沒問題。這個迭代解決方案的棘手部分是,除了在字符串末尾移動它之外,您還需要爲每個匹配找到for循環要處理的字符數,因此你得到了str.length-matches。否則你的循環也會處理已經在最後被傳送的標點符號,這是我們不想要的 –

相關問題