2011-05-19 79 views
4

我試圖找到如何轉換的東西像這樣全部大寫爲正常情況下

全部大寫TEXT一個完美的解決方案。 「爲什麼任何人都會使用它?」這是荒唐的!幫幫我。

...以正常情況。我可以或多或少與找到所有句子開始的字符:

(?<=^|(\. \"?)|(!))[A-Z] #this regex sure should be more complex 

但(標準)的Ruby既不允許lookbehinds,也有可能申請.capitalize,比方說,GSUB更換。我希望我能做到這一點:

"mytext".gsub(/my(regex)/, '\1'.capitalize) 

,但當前工作的解決辦法是

"mytext".split(/\. /).each {|x| p x.capitalize } #but this solution sucks 
+0

呃......這個解決方案不吸。 – SLaks 2011-05-19 23:41:15

+0

你正在編寫一個堆棧溢出客戶端嗎? – 2011-05-20 02:45:21

+0

實際上,我製作了自己的TextMate文本處理包(用於處理各種形式的產品說明)。不幸的是標準TM文本包缺乏這種特殊的功能。 – Kinkou 2011-05-20 12:33:21

回答

4

首先,注意到你正在嘗試做的將只是一個近似值。

  1. 您無法正確判斷句子的邊界在哪裏。您可以將其近似爲整個字符串的開頭或者在句點,問號或感嘆號之後加空格。但是,你會錯誤地將「經濟」用於「美國經濟」。

  2. 您無法正確判斷哪些詞應該大寫。例如,「約翰」將是「約翰」。

你可能想要做一些自然語言處理,在很多情況下給你一個接近正確的結果,但這些方法只是probablistically正確的。你永遠不會得到完美的結果。

瞭解這些限制,你可能想要做的:

mytext.gsub(/.*?(?:[.?!]\s+|\z)/, &:capitalize) 
+1

豔麗的sawa!我希望我知道'&:capitalize'語法。我調整了一些正則表達式來匹配例如_ ..句尾的句子。 「這是一個新句子的開始。」句子三._:'。*?(?:[。?!] \「?\ s + \」?| \ z)'並添加了.gsub(/ i(?:\ s | \')/ :upcase)'到行尾。表達式現在給出了相當可接受的結果感謝您的幫助! – Kinkou 2011-05-20 13:19:50

相關問題