我正在使用Rails 5.我想知道一个变量(你可以假设是一个字符串)是否包含至少一个字母(大写或小写)。但是,我不想使用正则表达式(我注意到如果编码不是UTF-8,则常规表达式倾向于崩溃)。所以我想知道如何检查一个字符串是否至少有一个字母。
这不起作用
input.downcase.include?("abcdefghijklmnopqrstuvwxyz")
答案 0 :(得分:6)
试试这个
str.count("a-zA-Z") > 0
count
function接受字符集作为参数。
但是ArgumentError: invalid byte sequence in UTF-8
可能仍会失败。如果您的输入无效,则可能无法修复编码。
NB,这会扫描整个字符串,但downcase
也是如此。对于性能基准测试,请参阅Eric的答案,在最坏情况和最佳情况之间,性能差异很大。一如既往,可读性是在过早优化之前进行的。
答案 1 :(得分:3)
您可以使用:
char >= 'a'
它使用的Range#cover?比Range#include?快,因为它只检查char <= 'z'
和"1#+~?5()=[" * 10_000
。
在最糟糕的情况下(没有字母Running each test 8 times. Test will take about 9 seconds.
_akuhn is faster than _mudasobwa by 2.0x ± 0.01
_mudasobwa is faster than _cary by 14x ± 0.1
_cary is faster than _eric_duminil by 10.5x ± 0.1
的巨大字符串):
Running each test 2048 times. Test will take about 7 minutes.
_cary is faster than _eric_duminil by 12x ± 1.0
_eric_duminil is faster than _mudasobwa by 430x ± 10.0
_mudasobwa is faster than _akuhn by 3x ± 0.1
使用mp3文件的尾部(600kb):
var track;
function successCallback(stream) {
localstream = stream; // stream available to console
track = stream.getTracks()[0];
if (window.URL) {
video.src = window.URL.createObjectURL(stream);
} else {
video.src = stream;
}
}
track.stop();
看到结果变化如此之大,这很有趣。
答案 2 :(得分:1)
checker = lambda do |input|
"abcdefghijklmnopqrstuvwxyz".split('').any? &input.downcase.method(:include?)
end
checker.('3F3')
#⇒ true
checker.('42')
#⇒ false