Исключение из заглавных букв в предложении

У меня есть этот сценарий, который с заглавной буквы первой буквы каждого предложения:

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

Я хочу добавить исключение: первое слово в предложении после ., ?, а также ! символы не должны начинаться с заглавной буквы, если перед символом стоит xy слово.

В моем случае от capitalization of string xy. is not correct. будет Capitalization of string xy. Is not correct.

Я хочу в результате: Capitalization of string xy. is not correct.

Есть идеи?

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/

Вы можете использовать это:

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 словом, но это будет гораздо сложнее.

Другие вопросы по тегам