我搜索了一个函数,该函数可以使用特定规则将用户的输入转换为新的输出。
该规则是:
首字母大写(例如:巴黎)
如果字符串在每个单词之间包含两个破折号(-),请在第二个单词的第一个字母上使用大写字母(例如:Saint-Etienne)
如果字符串中包含两个破折号(-)之间的特定单词,例如:au
,aux
,et
,sur
...,请在这些单词的第一个字母上加上小写字母(例如: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
有人可以帮我添加此功能的最新规则吗?
谢谢
最佳答案
所以我想出了使用split
和join
的方法。似乎可以处理所有情况。
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是否可以解决您的问题。