如果该单词的第一个单词(一个或多个)全部在CAP中,我想用大写词替换这些单词(使用ruby的.capitalize
)。对于例如“FOO BAR” 到 “富酒吧”用大写字替换单词
我试过如下:
line.gsub!(/^([A-Z ]+)/, '\1'.capitalize)
和
line.gsub!(/^([A-Z ]+)/, "\\1".capitalize)
这两人都没有工作。有没有办法做到这一点?
如果该单词的第一个单词(一个或多个)全部在CAP中,我想用大写词替换这些单词(使用ruby的.capitalize
)。对于例如“FOO BAR” 到 “富酒吧”用大写字替换单词
我试过如下:
line.gsub!(/^([A-Z ]+)/, '\1'.capitalize)
和
line.gsub!(/^([A-Z ]+)/, "\\1".capitalize)
这两人都没有工作。有没有办法做到这一点?
尝试:
line.gsub!(/^([A-Z ]+)/) { |w| w.capitalize }
在IRB:
require 'active_support'
'FOO bar'.gsub(/^[A-Z]+/) { |w| w.capitalize }
=> "Foo bar"
或OP的版本:
'FOO bar'.gsub!(/^([A-Z ]+)/) { |w| w.capitalize }
=> "Foo bar"
对于前两个单词,这是快速和肮脏的:
'FOO BAR'.gsub!(/^([A-Z ]+ [A-Z]+)/) { |w| w.capitalize }
=> "Foo bar"
可以使用得到一点点漂亮:
'FOO BAR'.gsub!(/^((?<word>[A-Z]+) \g<word>)/) { |w| w.capitalize }
=> "Foo bar"
当然,使用一个固定的字符串!
版本的gsub
不会做任何有用的事情。
的OP增加了额外的约束:
require 'active_support'
line = 'AFOO BFOO CFOO DFOO e f g'
words = line[/^(?:[A-Z]+)+/].split.map{ |w| w.capitalize } # => ["Afoo", "Bfoo", "Cfoo", "Dfoo"]
[words,line.split[words.size..-1]].join(' ') # => "Afoo Bfoo Cfoo Dfoo e f g"
我不是红宝石程序员,但我可以看到你在字符串\1
,当然这仅仅是\1
再次调用capitalize
。您将需要寻找类似于PHP的preg_replace_callback
的东西,这将允许您通过函数运行正则表达式匹配 - 在此例中为capitalize
。
你想要大写所有单词,正确吗? 尝试字符串#扫描,而不是:
line.scan(/\w+|\W+/).map(&:capitalize).join
这适用,但只适用于第一个全部大写字。你知道如何使它适用于前两个单词全部大写的情况吗? – zanbri
只需要在[]中添加空格字符。他在他的例子中忘了(?)。 – oldergod
我尝试了这个空间,它仍然不适用于第二个全部字的单词。 – zanbri