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

2) 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.

Alle Saturday 02 February 2008, Dondi ha scritto:

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

2) 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:

class String

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

def consonants
   gsub(/[aeiou]/, '')
end

end

Stefano

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

Not sure if OP excluded non letters from the input

class String

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

def consonants
   gsub(/[aeiou]/, '')
end

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

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

"corey".split(//).partition { |x| "aeiouAEIOU" }

returns

=> [["o", "e"], ["c", "r", "y"]]

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

you might want to skip spaces

-Corey

···

On Feb 2, 2008 12:38 PM, Robert Dober <robert.dober@gmail.com> wrote:

>
> A simple (but I fear not too efficient) way is:
Not sure if OP excluded non letters from the input
>
> class String
>
> def vowels
> gsub(/[^aeiou]/, '')
> end
>
> def consonants
> gsub(/[aeiou]/, '')
> end
>
> 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

--

The Internet's Premiere source of information about Corey Haines

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" }

Robert

···

On Feb 2, 2008 7:27 PM, Corey Haines <coreyhaines@gmail.com> wrote:

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

"corey".split(//).partition { |x| "aeiouAEIOU" }

returns

=> [["o", "e"], ["c", "r", "y"]]

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

you might want to skip spaces

-Corey

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

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

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" }

NoMethodError: undefined method `each_char' for "coreyhaines":String

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

···

On Feb 2, 2008 5:04 PM, Robert Dober <robert.dober@gmail.com> wrote:

On Feb 2, 2008 7:27 PM, Corey Haines <coreyhaines@gmail.com> wrote:
> Elegant? I don't know, but I kind of like it. :slight_smile:
>
> "corey".split(//).partition { |x| "aeiouAEIOU" }
>
> returns
>
> => [["o", "e"], ["c", "r", "y"]]
>
> irb(main):006:0> "corey haines".split(//).partition { |x|
"aeiouAEIOU" }
> => [["o", "e", "a", "i", "e"], ["c", "r", "y", " ", "h", "n", "s"]]
>
> 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" }

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

--

The Internet's Premiere source of information about Corey Haines

: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."

···

On Feb 2, 2008 5:07 PM, Robert Dober <robert.dober@gmail.com> wrote:

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

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

R.

--

The Internet's Premiere source of information about Corey Haines

Oh sorry using 1.9 excluseviley now...
Robert

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

Thanks for the ideas.

-Corey

···

On Feb 2, 2008 5:17 PM, Robert Dober <robert.dober@gmail.com> wrote:

Oh sorry using 1.9 excluseviley now...
Robert

--

The Internet's Premiere source of information about Corey Haines