2016-05-07 4 views
-2

文字列中の各単語の中間(最初と最後の文字以外)を削除したいと思います。各単語の真ん中を削除する

"Bob" #=> "Bb" 
"12309123" #=> "13" 
"Davy Jones" #=> "Dy Js" 

どうすればよいですか?何

(?<=\S)

+1

'' A ''や' 'Be" 'の出力はどれくらいですか? –

+3

こんにちは、ようこそ!より良い質問をする方法については[こちら](http://stackoverflow.com/help/how-to-ask)の記事をお読みください。具体的には、あなたが試したコードと具体的に何が問題になっているのかを記入してください。 –

+0

@Iggy正規表現を使わずにこれを実現したい場合に備えて、私の答えはあなたがどのようにできるかを示しています。 – Aph

答えて

3

置き換え(?<=\S)\S+(?=\S)は前に非空白文字があるチェック後読みです。

(?=\S)は、後に空白文字がないかどうかをチェックする先読みです。

注:「単語」と呼ばれるものは正確にはわかりませんが、おそらく文字クラス\wがあなたのニーズに適していると思われます。この場合、あなたは前後参照を避けるために、このような非単語の境界を使用してパターンを書き込むことができます。

\B\w+\B 
+0

茶色の牛はいかがですか?gsub(/(?<= \ S)\ S +(?= \ S)/、 ")#=>" Hw n、 OPは "各単語"の中間の文字を削除したいだけなので、カンマと疑問符は単語の一部ではないので、 "Hw nw、bn cw?" 'を返す必要があります。 –

+0

@CarySwoveland:あなたが見ることができるように、私はこのケースの注釈に他のパターンを付けました(質問の「単語」が「単語の文字」を意味する場合)。 –

+0

ああ、 '\ B \ w + \ B'はとても涼しいです! –

1

これはおそらくのように巧妙ではありませんが、それは同じことを行います。"my dog has fleas".gsub(/(\w)\w+(\w)/, "\\1\\2") #=>my dg hs fs

ideone demo/ regex demoをあなたがACHしたい場合は

foo = 'barbaz' 
foo[1..-2] = '' 
foo # => "bz" 
+0

Rubyでは 's =" my dog has notisle "と書く必要があります。 '\ 1 \ 2')#=> "my dg hs fs" 'または' s.gsub(/(\ w)\ w +(\ w) )/){$ 1 + $ 2}#=> "私のdg hs fs"私はRubyが 'g'オプションをサポートしているとは思わない。 –

+0

が動作するようです:$ stdout.write( "私の犬にはノミがあります" .gsub(/(\ w)\ w +(\ w)/、 "\\ 1 \\ 2"))http://ideone.com/ q11iit – sweaver2112

+1

@CarySwoveland Rubyは 'g'フラグをサポートしていません。それが 'gsub'のためのものです。 –

2

ちょうどString's []スライスを使用します正規表現を使用せずにこれをieve:

original = 'Davy Jones'.split() 

original.each do |string| 
    words = string.split(//) 
    no_middle = "#{words[0]}#{words[words.length- 1]}" 
    print no_middle 
    print ' ' 
end 

出力:

Dy Js 
+1

質問には、「各単語を文字列に入れます」という質問が含まれています。 –

+0

"単語"を定義します。 OPはそれを定義していなかったし、コードを続けるまではそれほど有用ではないだろう。 –

0

あなたは、単に標準のRuby String#gsubメソッドを使用することができます。ここではそれがどのように見えるかです:

string.gsub(/(\w)\w+(\w)/, "\\1\\2") 

これは、内部マッチャーパターンとして\w+を使用して、3つの以上の文字があるときにのみ一致します。同じ場所に\w*を使用するよりも優れた解決策として、2文字の単語を偶然照合して単語自体を置き換えることで、パフォーマンスが低下することはありません。ブロックや文字列を呼び出していないことにより、パフォーマンスを向上させる、

string.gsub(/\b\w\w\w+\b/) {|s| s[0]+s[-1] } 

ブロックのバージョンが少なくとも3つの文字が一致することを確実にするために:

代わりに、各試合に呼び出される#gsubにブロックを供給することができますそれが要求されない限り、ここで使用できる他の(たぶん良い)正規表現がありますが、これは目的に合っています。

には、#gsub!と呼ばれる使用可能な修正版があります。同じように動作しますが、渡す文字列は変更されます。私は#gsubの例を挙げていますが、あなたが好むものがあれば#gsub!と同じテクニックを使うことができます。

strings = [ \ 
    "Bob",   #=> "Bb" 
    "12309123", #=> "13" 
    "Davy Jones", #=> "Dy Js" 
    "How now brown cow, may your day be a model of happiness" 
] 

strings.each do |string| 
    puts "String '#{string}' becomes '#{string.gsub(/(\w)\w+(\w)/, "\\1\\2")}'" 
    puts "String '#{string}' becomes '#{string.gsub(/\b\w\w\w+\b/) {|s| s[0]+s[-1] }}'" 
end 

この意志の出力は次のとおりです:

String 'Bob' becomes 'Bb' 
String 'Bob' becomes 'Bb' 
String '12309123' becomes '13' 
String '12309123' becomes '13' 
String 'Davy Jones' becomes 'Dy Js' 
String 'Davy Jones' becomes 'Dy Js' 
String 'How now brown cow, may your day be a model of happiness' becomes 'Hw nw bn cw, my yr dy be a ml of hs' 
String 'How now brown cow, may your day be a model of happiness' becomes 'Hw nw bn cw, my yr dy be a ml of hs' 
1
str = "How now, brown cow, are you a Jersey?" 

str.gsub(/\w+/) { |s| (s.size==1) ? s : s[0]+s[-1] } 
    #=> "Hw nw, bn cw, ae yu a Jy?" 

...しかしCasimiretHippolyteの

@ここ

とは、両方の方法を使用して、あなたのサンプル文字列や他のものを使用した例です

str.gsub(/\B\w+\B/, "") 
    #=> "Hw nw, bn cw, ae yu a Jy?" 

は猫の鳴き声です。

関連する問題