2011-05-19 80 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

相关问题