城市FR格式化案例

时间:2016-03-28 14:17:10

标签: javascript regex replace formatting

我搜索的函数可以将用户的输入转换为具有特定规则的新输出。

这条规则是:

  • 首字母大写(例如: P

  • 如果字符串在每个单词之间包含两个破折号( - ),请在第二个单词的第一个字母上应用大写字母(例如:Saint- E tienne)

  • 如果字符串包含特定字词,例如:auauxetsur ...两个短划线( - )之间,请应用小写字母在这些词的第一个字母上(例如:圣艾蒂安 - 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();
    });
}
  1. 输入:paris ---> 输出:Paris
  2. 输入:saint-etienne ---> 输出:Saint-Etienne
  3. 输入:saint-etienne-aux-Temples ---> 输出: Saint-Etienne-aux-Temples
  4. 输入:parigné-l'eveque ---> 输出:Parigné-l'Eveque
  5. 有人可以帮我添加此功能的最后规则吗?

    谢谢

2 个答案:

答案 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有更清洁的解决方案,欢迎这样做:)