28

本周早些时候我刚刚开始修补 Ruby,但我遇到了一些我不太了解如何编码的东西。我正在将一个用 Java 编写的扫描仪转换为 Ruby 以进行类分配,我已经深入到本节:

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

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

lookAhead是从字符串中挑选出的单个字符(每次循环移动一个空格),这两种方法确定它是字符还是数字,返回适当的标记类型。我一直无法找出与Character.isLetter()and等价的 Ruby Character.isDigit()

4

3 回答 3

56

使用匹配字母和数字的正则表达式:

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

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

这些被称为 POSIX 括号表达式,它们的优点是给定类别下的 unicode 字符将匹配。例如:

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

您可以在Ruby 的正则表达式文档中阅读更多内容。

于 2013-01-27T20:36:51.463 回答
14

最简单的方法是使用正则表达式:

def numeric?(lookAhead)
  lookAhead =~ /[0-9]/
end

def letter?(lookAhead)
  lookAhead =~ /[A-Za-z]/
end
于 2013-01-27T19:30:50.310 回答
3

正则表达式在这里是多余的,它在性能方面要昂贵得多。如果您只需要检查字符是否为数字,则有一种更简单的方法:

def is_digit?(s)
  code = s.ord
  # 48 is ASCII code of 0
  # 57 is ASCII code of 9
  48 <= code && code <= 57
end

is_digit?("2")
=> true

is_digit?("0")
=> true

is_digit?("9")
=> true

is_digit?("/")
=> false

is_digit?("d")
=> false
于 2021-01-26T20:16:43.687 回答