句子大写异常

时间:2014-01-12 21:38:11

标签: javascript regex string uppercase capitalization

我有这个脚本,它将每个句子的第一个字母大写:

String.prototype.capitalize = function() {
    return this.replace(/.+?[\.\?\!](\s|$)/g, function (txt) {
        return txt.charAt(0).toUpperCase() + txt.slice(1);
    });
};

我想添加一个例外:.?!字符后面的第一个单词如果字符前面有{{1},则不应该大写单词。

我的案例来自xycapitalization of string xy. is not correct.

我想要结果:Capitalization of string xy. Is not correct.

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

由于Javascript不支持lookbehinds,因此您可以更轻松地完成您编写的函数,然后随意将错误大写的位修改为小写。

工作示例:

String.prototype.capitalize = function(exception) {
    var result = this.replace(/.+?[\.\?\!](\s|$)/g, function (txt) {
        return txt.charAt(0).toUpperCase() + txt.slice(1);
    });
    var r = new RegExp(exception + "\\.\\s*\(\\w+\)", "i");
    return result.replace(r, function(re) { return(re.toLowerCase()) });
};

alert("capitalization of string xy. is not correct.".capitalize("xy"));

您可能可以增强它来处理一系列异常,甚至使用正则表达式。

以下是一个有效的例子:http://jsfiddle.net/remus/4EZBb/

答案 1 :(得分:1)

你可以用这个:

String.prototype.capitalizeSentencesWithout = function(word) {
    return this.replace(/.+?[\.\?\!](?:\s|$)/g, function (txt, pos, orig) {
        if (orig.slice(pos-word.length-2, pos-2) == word)
            return txt;
        return txt.charAt(0).toUpperCase() + txt.slice(1);
    });
};

用法:

> "capitalization of string xy. is correct.".capitalizeSentencesWithout("xy")
"Capitalization of string xy. is correct."

您也可以通过让.+?表达式贪婪地使用xy字来解决这个问题,但这会变得更加复杂。