我搜索了一个函数,该函数可以使用特定规则将用户的输入转换为新的输出。

该规则是:


首字母大写(例如:巴黎)
如果字符串在每个单词之间包含两个破折号(-),请在第二个单词的第一个字母上使用大写字母(例如:Saint-Etienne)
如果字符串中包含两个破折号(-)之间的特定单词,例如:auauxetsur ...,请在这些单词的第一个字母上加上小写字母(例如:Saint-Etienne-辅助神庙)
如果字符串包含单引号的单词,如:l'eveque ...在两个破折号(-)之间,则在单词的单引号之后将第一个字母的小写字母和字母的大写字母(例如:Parigné-l' Evèque)。


这对我来说是一项艰巨的任务,但是我发现此函数尊重第一和第二条规则,但不尊重第三和第四条规则:

function ucwords(str,force) {
    str=force ? str.toLowerCase() : str;
    return str.replace(/(^([a-zA-Z\p{M}]))|([ -][a-zA-Z\p{M}])/g,
    function(firstLetter){
        return firstLetter.toUpperCase();
    });
}



输入:paris --->输出:Paris
输入:saint-etienne --->输出:Saint-Etienne
输入:saint-etienne-aux-Temples --->输出:
Saint-Etienne-aux-Temples
输入:parigné-l'eveque --->输出:Parigné-l'Eveque


有人可以帮我添加此功能的最新规则吗?

谢谢

最佳答案

所以我想出了使用splitjoin的方法。似乎可以处理所有情况。

function myUC(str){
    var wds = str.split('-');
    var acc = [];

    var exclude = ["aux", "au","et", "sur", "des", "le", "les"];

    wds.forEach(function(wd){
        if(wd.length == 0)
            return;
        else if(exclude.includes(wd)){
            acc.push(wd);
        }else if(wd.indexOf("'") == 1){
            acc.push(wd[0].toLowerCase() + "'" + wd[2].toUpperCase() + wd.substr(3));
        }else{
            acc.push(wd[0].toUpperCase() + wd.substr(1));
        }
    });

    return acc.join('-');
}


抱歉,我不知道regex是否可以解决您的问题。

09-25 18:23