我可以正常使用,所有变体都应该按原样显示Sint-Anna,但是我想知道,有没有一种更简单的方法,因为它看起来很混乱?

String.prototype.capitalize = function(){
    var sa = this.replace(/-/g,' ');
    var saa = sa.toLowerCase();
    var sb = saa.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } );
    var sc = sb.replace(/\s+/g, '-');
    return sc;
};

console.log('sint-anna'.capitalize());
console.log('sint anna'.capitalize());
console.log('sint-Anna'.capitalize());
console.log('Sint Anna'.capitalize());
console.log('SiNt anna'.capitalize());
console.log('SINT ANNA'.capitalize());


控制台:

Sint-Anna
Sint-Anna
Sint-Anna
Sint-Anna
Sint-Anna
Sint-Anna


不可能有像Si ntAn na这样的错误输入导致Si-Ntan-Na

评论

我知道您说的是javascript,但我来晚了,但是如果适合您,也可以使用CSS。文本转换:大写完全可以按照您的需要进行操作。

#1 楼

您的问题是一个有趣的问题,但是您的解决方案不是很好地使用正则表达式,因为有一个更好的选择是使用“单词边界”锚\b

边界锚匹配从a到a的过渡。单词,改为非单词,反之亦然。为此,请在正确的解决方案之后使用\w匹配来定位字字符。

请注意,您为replace操作提供的replace-function现在仅需要\b参数,没有

如果您的代码编写为:

    String.prototype.capitalize = function(){
        return this.toLowerCase().replace( /\b\w/g, function (m) {
            return m.toUpperCase();
        });
    };


,那么您将转换为小写字母,然后找到任何单词的第一个字母,然后将其转换为大写。

将其付诸行动,例如:




 m 




评论


\ $ \ begingroup \ $
我注意到,这将大写字母后的符号的第一个字母,而不是数字后的。例如。 %asdf =%Asdf,但3asdf = 3asdf。不知道这是否是一个问题,但以为我会提到它。
\ $ \ endgroup \ $
– Michael McGriff
2015年1月15日在23:08



\ $ \ begingroup \ $
它的行为不正确,例如Érica(将其转换为éRica)。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年1月16日,0:25

\ $ \ begingroup \ $
@IsmaelMiguel-是的,确实如此,并提醒我JavaScript不支持RegExes的unicode ......简直糟透了。我试图弄清楚如何更改它(表达式),但是会很丑。
\ $ \ endgroup \ $
–rolfl
15年1月16日,0:41

\ $ \ begingroup \ $
尝试用/ \ b [\ w \ u00E0- \ u00F6 \ u00F7- \ u00FF] /或/ \ b [\wà-öø-ÿ] /替换/ \ b \ w /。您可以在此处检查更多UTF8间隔:utf8-chartable.de/unicode-utf8-table.pl?number=512
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年1月16日在12:47

\ $ \ begingroup \ $
作为旁注,您应该将更改为。如今,使用内联事件是一件坏事。使用更好的事件监听器。甚至field.oninput = function(){}都比内联处理程序好。
\ $ \ endgroup \ $
–伊斯梅尔·米格尔(Ismael Miguel)
15年1月16日在12:52

#2 楼

使数组中所有首字母大写的最简单方法:

for (var i = 0 ; i < yourArray.length ; i++) {
    curTokens[i] = yourArray[i].charAt(0).toUpperCase()+yourArray[i].substr(1);
}
console.log(yourArray);


每个第一个字符都使用charAt(0)获取,并使用.toUpperCase()更改为大写。我们使用yourArray.substr(1);附加字符串的其余部分。