Need regex to check for consonants and put number after each consonant

Hello,

im working on code to check if a character is a consonant or not and if
it is to put a number after each one. This is what ive got so far.

class Num

  def to_num( c )
    c.each do |c|
      if c =~ /![aeiou]/
        c.join( "0" )
      end
    end
  end

end

Num.to_num( "Wow! Look at this get a number after each letter!" ) { |c|
print c}

I keep getting the undefined method to_num for Num:class

Any suggestions on what i can do to get this to work? Any help is
appreciated! Thanks!

···

--
Posted via http://www.ruby-forum.com/.

Hi,

this cannot work. First of all, to_num() is an instance method and not a
class method. You cannot call it on Num, but you'd have to create an
instance first and then call it on this object. Secondly, the method
doesn't take a block, so the {|c| print c} is useless code. And the
method itself also looks strange. You keep overwriting the "c" variable
with completely different objects, I'm not even sure what will happen.
And the regex syntax is wrong.

So you want to put a "0" after each consonant? Then simply use
String#gsub:

str = 'Wow! Look at this get a number after each letter!'
puts str.gsub(/(?<=[bcdfghj-np-tvwxz])/i, '0')

···

--
Posted via http://www.ruby-forum.com/.

That's because to_num is an instance method (that is, a method defined on
instances of class Num) rather than a method of the class itself. You can
solve the problem in two ways:
* create an instance of num and call its to_num method:
  n = Num.new
  n.to_num
* define to_num as a class method:
  class Num
    def self.to_num #note the self!
      ...

Also note that your regexp won't work as you expected. To match a character
other than those included in a list, you need to put a ^ at the beginning of
the list:
  if c =~ /[^aeiou]/

I hope this helps

Stefano

···

On Thursday 01 November 2012 Justin Gamble wrote

Hello,

im working on code to check if a character is a consonant or not and if
it is to put a number after each one. This is what ive got so far.

class Num

  def to_num( c )
    c.each do |c|
      if c =~ /![aeiou]/
        c.join( "0" )
      end
    end
  end

end

Num.to_num( "Wow! Look at this get a number after each letter!" ) { |c|
print c}

I keep getting the undefined method to_num for Num:class

Any suggestions on what i can do to get this to work? Any help is
appreciated! Thanks!

--
Posted via http://www.ruby-forum.com/\.

Thank you so much for your help guys! That part worked like a charm!

Now how would I go about taking the 0 out of a sentence that is passed
thru to_num?

I have this:

class Num
  def to_num( string )
    string.gsub( /(?<=[bcdfghj-np-tvwxz])/i, '0' )
  end

def to_english( num_string )
    num_string.gsub( /[0]/, '' )
  end
end

num= Num.new

puts num.to_num( "Wow! Look at this get converted to Num!" ) { |c| print
c}

num_string = ""
num.to_num( "I'm in num but I want to be in english." ) { |c| num_string
+= c }
puts num_string

puts num.to_english( num_string ) { |c| print c }

its the same instance of the first created class.

···

--
Posted via http://www.ruby-forum.com/.

I think you misunderstand how methods and blocks work. You continue to
write a block after the method calls, but your method doesn't use blocks
(there's no "yield"). So all the "print c" and "num_string += c" etc. is
simply ignored. It has no effect at all.

What your method does is return the result of the conversion. So you can
output the return value, store it in a variable etc.:

···

#----------------------------------
num = Num.new
# convert to num
num_converted = num.to_num("Wow! Look at this get converted to Num!")
puts num_converted
# convert back to English
puts num.to_english(num_converted)
#----------------------------------

Of course you *could* use blocks, but then you'd have to define your
method accordingly. Judging from your examples, it seems you want to
pass the conversion result to the block:

#----------------------------------
class Num
  def to_num( string )
    res = string.gsub( /(?<=[bcdfghj-np-tvwxz])/i, '0' )
    yield res if block_given?
    res
  end

  def to_english( num_string )
    res = num_string.gsub( /[0]/, '' )
    yield res if block_given?
    res
  end
end

num = Num.new
num.to_num( "Wow! Look at this get converted to Num!" ) do |result|
  puts result
end
#----------------------------------

However, I can't see any use for this block variant, because the method
doesn't do anything useful with the block. So I'd simply return the
value like above and not use blocks.

--
Posted via http://www.ruby-forum.com/.

Stefano Crocco wrote in post #1082269:

Also note that your regexp won't work as you expected. To match a
character
other than those included in a list, you need to put a ^ at the
beginning of
the list:
  if c =~ /[^aeiou]/

This matches *any* character that's not a vowel, for example digits or
special chars $, !, %, ... or whitespace etc.

If you want consonants, you either have to explictly write them down
(like I did in the previous post) or use the intersection of all
alphabetic characters [a-z] with the non-vowels [^aeiou]:

consonants = /[a-z&&[^aeiou]]/i

But since this syntax isn't well-known, I'd probably just write down the
characters.

···

--
Posted via http://www.ruby-forum.com/\.