Extracting vowels and consonants using regular expression

I am trying to parse a string and extract all vowels and consonants
into two separate substrings. However, I can’t get my solution to
work. Any pointers are appreciated. Here is the approach I am using:

  1. Extended the String Class with the following methods:

class String
def vowels
self.scan(/[aeiou]|(?![aeiou])y(?![aeiou])/i)
end

def consonants
self.scan(/![aeiou]|(?=[aeiou])y(?=[aeiou])/i)
end
end

  1. Invoke the methods:

test_paragraph = “Mary had a little lamb”
@vowel_sub_str = test_paragraph.vowels
@consonant_sub_str = test_paragraph.consonants

However, the result is just two empty strings. I believe the problem
is in the regular expression, but I can’t figure out just where. Any
ideas/pointers are appreciated.

Thanks.

A simple (but I fear not too efficient) way is:
Not sure if OP excluded non letters from the input

end

Stefano

This shall do it in one run, quite complicated code, interested if
something more elegant can be found.
class String
def v_c
each_char.inject([“”,“”]){ |r, c|
case c
when /[aeiouy]/i
[r.first << c, r.last ]
when /[^a-z]/i
r
else
[r.first, r.last << c ]
end
}
end
end

HTH
Robert


http://ruby-smalltalk.blogspot.com/


Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

Alle Saturday 02 February 2008, Dondi ha scritto:

However, the result is just two empty strings. I believe the problem
is in the regular expression, but I can’t figure out just where. Any
ideas/pointers are appreciated.

Thanks.

A simple (but I fear not too efficient) way is:

class String

def vowels
gsub(/[^aeiou]/, ‘’)
end

def consonants
gsub(/[aeiou]/, ‘’)
end

end

Stefano

Elegant? I don’t know, but I kind of like it. :slight_smile:

“corey”.split(//).partition { |x| “aeiouAEIOU”[x] }

returns

=> [[“o”, “e”], [“c”, “r”, “y”]]

irb(main):006:0> “corey haines”.split(//).partition { |x|
“aeiouAEIOU”[x] }
=> [[“o”, “e”, “a”, “i”, “e”], [“c”, “r”, “y”, " ", “h”, “n”, “s”]]

you might want to skip spaces

-Corey

“cor4ey ha2ines”.scan(/[a-z]/i).join.each_char.partition { |x| “aeiouAEIOU”[x] }
and some golfing

                { |x| /[aeiou]/i =~ x }

R.

Sweet! I like pulling the numbers out, but I get this in irb

irb(main):001:0> “cor4ey
ha2ines”.scan(/[a-z]/i).join.each_char.partition {
|x| “aeiouAEIOU”[x] }
NoMethodError: undefined method `each_char’ for “coreyhaines”:String

Why not use split(//) instead of each_char?

On Feb 2, 2008 7:27 PM, Corey H. [email protected] wrote:

you might want to skip spaces

-Corey
Excellent Corey, allow me to make it fit any string, I still have
not seen any statement that we are treating letters only :wink:

“cor4ey ha2ines”.scan(/[a-z]/i).join.each_char.partition { |x|
“aeiouAEIOU”[x] }

Robert

Whereof one cannot speak, thereof one must be silent.
Ludwig Wittgenstein

Oh sorry using 1.9 excluseviley now…
Robert

:slight_smile: Cool. I wasn’t sure exactly how to do that. Now I do! And, in the
words
of one of my personal favorite philosophers, “Knowing is half the
battle.”

Okay. Sounds good. I’m still on 1.8.

Thanks for the ideas.

-Corey