2012-04-13 11 views
2

Sicher genug gibt es mehr als eine Möglichkeit, die folgenden Zeichenfolge zu konvertieren entweder links nach rechts Form oder umgekehrtStrings Manipulation

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

Was ist der rubin hier so?

+0

erm leider dank all Beitrag gefällt, können Sie Umformulieren Sie die Frage, die es einfach nicht sinnvoll ist –

+0

Angesichts der Zeichenfolge "Content-Management-Systeme" wie erhalten Sie "Content Management Systems" Zeichenfolge mit Ruby? Dann gegeben "Content Management Systems" wie erhalten Sie "Content-Management-Systeme"? –

Antwort

5

Das ist knifflig:

puts "content-management-systems".split("-").map(&:capitalize).join(" "). 
    tap{ |str| puts str}. 
    split.map(&:downcase).join("-") 

#=> Content Management Systems 
#=> content-management-systems 

Die vereinfachte Variante:

"content-management-systems".split("-").map(&:capitalize).join(" ") 
#=> Content Management Systems 

"Content Management Systems".split.map(&:downcase).join("-") 
#=> content-management-systems 

Die saubere Variante (von Micheal):

"content-management-systems".split("-").map(&:capitalize).join(" "). 
split(" ").map(&:downcase).join("-") 
+2

Und die komplette round-trip: '" Content-Management-Systeme ".split (" - "). Map (&: Großbuchstaben) .join (" ") .split (" ") .map (&: downcase). beitreten ("-") ' –

+0

Wow! Das ist großartig, du rockt! –

+0

@Micheal, du hast Recht, aber Sie können die Ergebnisse nicht sehen – megas

2

gsub regexp Spiele in Block manipuliert werden kann, Modus.

"content-management-systems". 
    gsub(/(\w+)(-)?/) { ($2 ? $1 + " " : $1).capitalize! }. 
    gsub(/(\w+)(\s)?/) { ($2 ? $1 + "-" : $1).downcase! } 

und wie diese Benchmark zeigt nicht viel Unterschied zwischen regexp und noregexp Versionen.

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) 
+0

Ich schätze regexp, ... aber sehe meine Antwort ... –

+0

@ LucaG.Soave ich weiß, nur hinzugefügt, um einen anderen Weg zu zeigen. –

+0

Ja, Regex fehlte hier, danke. –

1

ich diesen Beitrag nur, dass sich erinnern ... regex einfach doppelt Rechenzeit:

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) 

und ich würde :-)

+1

Danke für die Daten! Regexp ist nie so schnell wie manuelle Manipulation, aber es ist ziemlich schick ... und vielleicht schneller in der Programmierung, wenn Sie regexp gut kennen – texasbruce

+0

@Luca G. Soave, In diesem Fall brauchen Sie nicht 'tap {| str | puts str} ' – megas

+0

@megas richtig, in diesem Fall ist sogar ein bisschen schneller (0,000010 weniger) –