0
str = 'foo_bar    baz  __goo'

次のように印刷する必要があります

Foo Bar Baz Goo

使用しようとしましたが、複数のスペースsplit /(\s|_)/が返さ'_'れます...?' '

Ruby 1.9.3

4

5 に答える 5

3

これを試して:

str.split(/[\s_]+/).map(&:classify).join(" ")

アクティブなサポートにアクセスできる場合、または

str.split(/[\s_]+/).map(&:capitalize).join(" ")

プレーンルビーが必要な場合。

于 2012-10-10T16:18:00.790 に答える
2

文字列を分割してみてください:

[\s_]+
于 2012-10-10T16:15:21.250 に答える
2

あなたが意味していると仮定すると/(\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 ' '
于 2012-10-10T16:37:12.520 に答える
1

を使用/[\ _]+/して、1つ以上のオカレンスまたはスペースまたはアンダースコアを検索します。このようにして、複数のアンダースコア、スペース、または両方の組み合わせを使い果たすことができます。その後、配列を取得するので、mapそれぞれを変換するために使用します。後で、を使用してそれらをまとめることができますjoin。例を参照してください-

それらをリストに入れてください-

str.split(/[\ _]+/).map {|s| s.capitalize }
 => ["Foo", "Bar", "Baz", "Goo"] 

それらを文字列全体として取得します-

str.split(/[\ _]+/).map {|s| s.capitalize }.join(" ")
 => "Foo Bar Baz Goo" 
于 2012-10-10T17:19:47.657 に答える
1

ここに純粋なRubyバージョンがあります:

str = 'foo_bar    baz  __goo'
str.split(/[ _]+/).map{|s| s[0].upcase+s[1..-1]}.join(" ")
于 2012-10-10T17:19:50.783 に答える