2

案の定、次の文字列を左から右に、またはその逆に変換する方法以上のものがあります。

"content-management-systems" <=> "Content Management Systems"

ここでのルビーの方法は何ですか?

4

3 に答える 3

5

これはトリッキーなものです:

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("-")
于 2012-04-13T12:52:15.353 に答える
2

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)
于 2012-04-13T13:20:45.857 に答える
1

覚えておくためにこれを投稿します...正規表現は計算時間を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)

そして、私はすべての貢献に感謝したいと思います:-)

于 2012-04-13T13:27:23.590 に答える