2014-01-12 129 views
0

我有這個腳本,大寫每個句子的第一個字母:句子資本例外

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.

任何想法?

+0

不要試圖用正則表達式來解決這個問題。 JS不支持向後看。 – Bergi

+0

@Bergi是否可以在'xy.'之後小寫單詞? – zsola3075457

+0

確定這是可能的,但你不應該嘗試通過改變你的替換正則表達式。 – Bergi

回答

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/

+0

...但它需要成爲下一場比賽! – Bergi

+0

是的,在這上面工作:) – brandonscript

+0

好吧,看看更新的工作示例。 – brandonscript

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字,但這會變得更加複雜。