Ruby: How to find out if a character is a letter or a digit?

Cory Regan picture Cory Regan · Jan 27, 2013 · Viewed 41.7k times · Source

I just started tinkering with Ruby earlier this week and I've run into something that I don't quite know how to code. I'm converting a scanner that was written in Java into Ruby for a class assignment, and I've gotten down to this section:

if (Character.isLetter(lookAhead))
{      
    return id();
}

if (Character.isDigit(lookAhead))
{
    return number();
}

lookAhead is a single character picked out of the string (moving by one space each time it loops through) and these two methods determine if it is a character or a digit, returning the appropriate token type. I haven't been able to figure out a Ruby equivalent to Character.isLetter() and Character.isDigit().

Answer

Andrew Marshall picture Andrew Marshall · Jan 27, 2013

Use a regular expression that matches letters & digits:

def letter?(lookAhead)
  lookAhead.match?(/[[:alpha:]]/)
end

def numeric?(lookAhead)
  lookAhead.match?(/[[:digit:]]/)
end

These are called POSIX bracket expressions, and the advantage of them is that unicode characters under the given category will match. For example:

'ñ'.match?(/[A-Za-z]/)     #=> false
'ñ'.match?(/\w/)           #=> false
'ñ'.match?(/[[:alpha:]]/)  #=> true

You can read more in Ruby’s docs for regular expressions.