案の定、次の文字列を左から右に、またはその逆に変換する方法以上のものがあります。
"content-management-systems" <=> "Content Management Systems"
ここでのルビーの方法は何ですか?
これはトリッキーなものです:
puts "content-management-systems".split("-").map(&:capitalize).join(" ").
tap{ |str| puts str}.
split.map(&:downcase).join("-")
#=> Content Management Systems
#=> content-management-systems
簡略化されたバリアント:
"content-management-systems".split("-").map(&:capitalize).join(" ")
#=> Content Management Systems
"Content Management Systems".split.map(&:downcase).join("-")
#=> content-management-systems
クリーンなバリアント(Michealから):
"content-management-systems".split("-").map(&:capitalize).join(" ").
split(" ").map(&:downcase).join("-")
gsub
正規表現の一致は、ブロックモードで操作できます。
"content-management-systems".
gsub(/(\w+)(-)?/) { ($2 ? $1 + " " : $1).capitalize! }.
gsub(/(\w+)(\s)?/) { ($2 ? $1 + "-" : $1).downcase! }
これらのベンチマークは、regexpバージョンとnoregexpバージョンの間に大きな違いがないことを示しています。
require 'benchmark'
STR = "content-management-systems".freeze
Benchmark.bmbm(10) do |x|
x.report("noregexp") {
STR.split("-").map(&:capitalize).join(" ").
split(" ").map(&:downcase).join("-")
}
x.report("rgexp") {
STR.
gsub(/(\w+)(-)?/) { ($2 ? $1 + " " : $1).capitalize! }.
gsub(/(\w+)(\s)?/) { ($2 ? $1 + "-" : $1).downcase! }
}
end
__END__
Rehearsal ----------------------------------------------
noregexp 0.000000 0.000000 0.000000 ( 0.000032)
rgexp 0.000000 0.000000 0.000000 ( 0.000035)
------------------------------------- total: 0.000000sec
user system total real
noregexp 0.000000 0.000000 0.000000 ( 0.000051)
rgexp 0.000000 0.000000 0.000000 ( 0.000058)
覚えておくためにこれを投稿します...正規表現は計算時間を2倍にします:
1.9.2p290 :014 > time = Benchmark.measure do
1.9.2p290 :015 > puts "content-management-systems".split("-").map(&:capitalize).join(" ").
1.9.2p290 :016 > tap{ |str| puts str}.
1.9.2p290 :017 > split.map(&:downcase).join("-")
1.9.2p290 :018?> end
Content Management Systems
content-management-systems
=> 0.000000 0.000000 0.000000 ( 0.000077)
1.9.2p290 :019 > time = Benchmark.measure do
1.9.2p290 :020 > "content-management-systems".gsub(/(\w+)(-)?/) { ($2 ? $1 + " " : $1).capitalize! }
1.9.2p290 :021?> "Content Management Systems".gsub(/(\w+)(\s)?/) { ($2 ? $1 + "-" : $1).downcase! }
1.9.2p290 :022?> end
=> 0.000000 0.000000 0.000000 ( 0.000164)
そして、私はすべての貢献に感謝したいと思います:-)