ruby - 全部大写到正常大小写

标签 ruby string

我正试图找到一个优雅的解决方案来转换这样的东西

ALL CAPS TEXT. "WHY ANYONE WOULD USE IT?" THIS IS RIDICULOUS! HELP.

...到常规大小写。我或多或少可以找到所有句子开头的字符:

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

但是(标准)Ruby 既不允许后视,也不可能将 .capitalize 应用于 gsub 替换。我希望我能做到这一点:

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

但目前的工作解决方案是

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

最佳答案

首先,请注意您尝试做的只是一个近似值。

  1. 您无法正确判断句子边界在哪里。您可以将其近似为整个字符串的开头,或紧跟在句点、问号或感叹号之后的空格。但是,您将错误地将“美国经济”中的“经济”大写。

  2. 您无法正确判断哪些单词应该大写。例如,“约翰”将是“约翰”。

在许多情况下,您可能想要进行一些自然语言处理以获得接近正确的结果,但这些方法只是概率正确。你永远不会得到完美的结果。

了解这些限制,您可能想要做:

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

关于ruby - 全部大写到正常大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6066020/

相关文章:

c++ - printf 跳过字符数组的第一个字符

ruby-on-rails - 如何在 rake 任务中使用 ActiveRecord 模型和参数

ruby-on-rails - 字符串比较在 Ruby 中不起作用

ruby-on-rails - 在 Mini_Test 中调用任何 Ruby 类和未初始化的常量错误

Ruby + 选项解析器

c++ - 在 C++ 中连接两个自定义字符串对象?

c - 在 C 中拆分和访问字符串

java - 将 InputStream 转换为 base64 字符串

ruby-on-rails - 我如何为我的应用程序使用多个 Gemfiles?

ruby - 为什么 Ruby splat 不适用于条件赋值中的数组强制?