我搜索的函数可以将用户的输入转换为具有特定规则的新输出。
这条规则是:
首字母大写(例如: P )
如果字符串在每个单词之间包含两个破折号( - ),请在第二个单词的第一个字母上应用大写字母(例如:Saint- E tienne)
如果字符串包含特定字词,例如:au
,aux
,et
,sur
...两个短划线( - )之间,请应用小写字母在这些词的第一个字母上(例如:圣艾蒂安 - a ux-temples)
如果字符串包含单引号的单词,如:l'eveque
...在两个短划线( - )之间,请在第一个字母上应用小写,在单引号后面应用大写字母单词(例如:Parigné- l'E vè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
有人可以帮我添加此功能的最后规则吗?
谢谢
答案 0 :(得分:1)
所以我使用40 data _null_;
41 x = prxmatch('/^WORD_\d{4}_\w{3}\d{3}$/','WORD_0012_MUK613 | N');
42 put _all_;
43 run;
x=0 _ERROR_=0 _N_=1
和split
来提出这个问题。它似乎处理所有情况。
join
对不起,我不知道正则表达式是否能解决你的问题。
答案 1 :(得分:0)
好的,我编辑了@Heman Gandhi的答案,因为他的解决方案仅在字符串完全写入时才有效。
在我的情况下,我想在每次写东西时使用键盘来计算我的字符串。我的黑客解决方案是:
field.bind("keydown keypress", function (event) {
myUc(field.val());
});
function myUC(str){
var wds = str.split('-');
var acc = [];
var exclude = ["Aux","aux",
"Au","au",
"Et", "et",
"Sur","sur",
"Des","des",
"Le","le",
"Les","les"];
wds.forEach(function(wd){
if(wd.length == 0)
acc.push(wd[0]);
else if(exclude.includes(wd)){
acc.push(wd.toLowerCase());
} else if(wd.indexOf("'") == 1 && wd.length > 3) {
acc.push(wd[0].toLowerCase() + "'" + wd[2].toUpperCase() + wd.substr(3));
} else {
acc.push(wd[0].toUpperCase() + wd.substr(1));
}
});
return acc.join('-');
};
我不想在排除数组中定义两次相同的单词,但如果我不这样做,则函数循环无限期地通过两个条件。如果@Heman有更清洁的解决方案,欢迎这样做:)