str = 'foo_bar baz __goo'
次のように印刷する必要があります
Foo Bar Baz Goo
使用しようとしましたが、複数のスペースsplit /(\s|_)/
が返さ'_'
れます...?' '
Ruby 1.9.3
str = 'foo_bar baz __goo'
次のように印刷する必要があります
Foo Bar Baz Goo
使用しようとしましたが、複数のスペースsplit /(\s|_)/
が返さ'_'
れます...?' '
Ruby 1.9.3
これを試して:
str.split(/[\s_]+/).map(&:classify).join(" ")
アクティブなサポートにアクセスできる場合、または
str.split(/[\s_]+/).map(&:capitalize).join(" ")
プレーンルビーが必要な場合。
文字列を分割してみてください:
[\s_]+
あなたが意味していると仮定すると/(\s|_)/
(スラッシュの方向が重要です!)、正規表現はかなり近いです。結果に区切り文字(スペースとアンダースコア)が含まれる理由は括弧です。括弧は、返された配列に区切り文字を含めるようにスプリッターに指示します。
余分な空の文字列を取得する理由は\s
、1つのスペース(またはタブ)に正確に一致する、または1つのアンダースコアに正確に一致する'_'で分割しているためです。任意の数のスペースまたはアンダースコアを単一の区切り文字として扱いたい場合は+
、正規表現に追加する必要があります。これは、「前のものの1つ以上」を意味します。
ただし\s|_+
、「スペース、または1つ以上の下線」を意味します。+
をだけでなく、式全体に適用したいとします_
。それは私たちを括弧に戻します。この場合、2つの選択肢をキャプチャ(および返却)せずにグループ化する必要があります。その構文はです(?:...)
。したがって、これが結果です。
str.split(/(?:\s|_)+/)
ここで、大文字と小文字を正規化する場合は、次のようcapitalize
に、で実行できる各文字列で実行する必要がありますmap
。
str.split(/(?:\s|_)+/).map { |s| s.capitalize }
またはショートカットを使用します。
str.split(/(?:\s|_)+/).map(&:capitalize)
これまでのところ、これらのソリューションはすべて文字列の配列を返します。これを使用してさまざまなことを実行できます。ただし、それらを1つの文字列に戻したい場合は、を使用できますjoin
。たとえば、それらを1つのスペースでまとめるには、次のようにします。
str.split(/(?:\s|_)+/).map(&:capitalize).join ' '
を使用/[\ _]+/
して、1つ以上のオカレンスまたはスペースまたはアンダースコアを検索します。このようにして、複数のアンダースコア、スペース、または両方の組み合わせを使い果たすことができます。その後、配列を取得するので、map
それぞれを変換するために使用します。後で、を使用してそれらをまとめることができますjoin
。例を参照してください-
それらをリストに入れてください-
str.split(/[\ _]+/).map {|s| s.capitalize }
=> ["Foo", "Bar", "Baz", "Goo"]
それらを文字列全体として取得します-
str.split(/[\ _]+/).map {|s| s.capitalize }.join(" ")
=> "Foo Bar Baz Goo"
ここに純粋なRubyバージョンがあります:
str = 'foo_bar baz __goo'
str.split(/[ _]+/).map{|s| s[0].upcase+s[1..-1]}.join(" ")