在Ruby中,我可以检查字符串是否包含不使用正则表达式的字母吗?

时间:2017-01-08 18:32:01

标签: ruby-on-rails ruby string include

我正在使用Rails 5.我想知道一个变量(你可以假设是一个字符串)是否包含至少一个字母(大写或小写)。但是,我不想使用正则表达式(我注意到如果编码不是UTF-8,则常规表达式倾向于崩溃)。所以我想知道如何检查一个字符串是否至少有一个字母。

这不起作用

input.downcase.include?("abcdefghijklmnopqrstuvwxyz")

3 个答案:

答案 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