2016-11-03 11 views
0

感嘆符付きの文字列があります。私は単語の前の感嘆符ではなく、単語の終わりの感嘆符を削除したい。感嘆符はそれ自身ではなく、単語を伴わないと仮定する。私が言いたいのは、[a..z]を意味し、大文字にすることができます。例えばRubyで部分文字列の後に特定の文字を削除するには

:私は読んだことがある

exclamation("Hello world!!!") 
#=> ("Hello world") 

exclamation("!!Hello !world!") 
#=> ("!!Hello !world") 

How do I remove substring after a certain character in a string using Ruby?。これら2つは近いが異なる。

def exclamation(s) 
    s.slice(0..(s.index(/\w/))) 
end 

# exclamation("Hola!") returns "Hol" 

私もs.gsub(/\w!+/, '')を試しました。単語の前に'!'を保持していますが、と末尾の文字と感嘆符の両方がです。 exclamation("!Hola!!") #=> "!Hol"

最後に感嘆符のみを削除するにはどうすればよいですか?

答えて

1

あなたはこれを使用し理解することが困難な場合、正規表現を使用しない場合:

def exclamation(sentence) 
    words = sentence.split 
    words_wo_exclams = words.map do |word| 
    word.split('').reverse.drop_while { |c| c == '!' }.reverse.join 
    end 
    words_wo_exclams.join(' ') 
end 
1

あなたは、テストデータの多くを与えられていないが、ここで働くかもしれない何かの例です:

def exclamation(string) 
    string.gsub(/(\w+)\!(?=\s|\z)/, '\1') 
end 

\s|\z一部は、スペースや文字列の最後のいずれかを意味し、(?=...)をするための手段文字列を先読みしますが、実際には一致しません。

感嘆符がスペースに隣接していない"I'm mad!"のようなものの場合は機能しませんが、いつもそれを別の潜在的な単語の終わりのマッチとして追加することができます。

1
"!!Hello !world!, world!! I say".gsub(r, '') 
    #=> "!!Hello !world, world! I say" 

r =/
    (?<=[[:alpha:]]) # match an uppercase or lowercase letter in a positive lookbehind 
    !     # match an exclamation mark 
    /x    # free-spacing regex definition mode 

又は

r =/
    [[:alpha:]]  # match an uppercase or lowercase letter 
    \K    # discard match so far 
    !     # match an exclamation mark 
    /x    # free-spacing regex definition mode 

上記の例の場合には、"!!Hello !world, world I say"を返す正規表現に!+!を変更しなければなりません。

関連する問題