本周早些时候我刚刚开始修改Ruby,我遇到了一些我不太懂的代码。我正在将用Java编写的扫描程序转换为Ruby以进行类分配,我已经深入到本节:
if (Character.isLetter(lookAhead))
{
return id();
}
if (Character.isDigit(lookAhead))
{
return number();
}
lookAhead
是从字符串中挑出的单个字符(每次循环时移动一个空格),这两个方法确定它是字符还是数字,返回相应的标记类型。我无法找出与Character.isLetter()
和Character.isDigit()
等效的Ruby等价物。
答案 0 :(得分:41)
使用与字母&匹配的正则表达式位:
def letter?(lookAhead)
lookAhead =~ /[[:alpha:]]/
end
def numeric?(lookAhead)
lookAhead =~ /[[:digit:]]/
end
这些被称为POSIX括号表达式,它们的优点是给定类别下的unicode字符将匹配。例如:
'ñ' =~ /[A-Za-z]/ #=> nil
'ñ' =~ /\w/ #=> nil
'ñ' =~ /[[:alpha:]]/ #=> 0
您可以在Ruby’s docs for regular expressions中阅读更多内容。
答案 1 :(得分:13)
最简单的方法是使用正则表达式:
def numeric?(lookAhead)
lookAhead =~ /[0-9]/
end
def letter?(lookAhead)
lookAhead =~ /[A-Za-z]/
end
答案 2 :(得分:2)
正则表达式在这里是一种矫枉过正,它在性能方面要昂贵得多。如果您只需要检查字符是否为数字,则有一种更简单的方法:
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