如何在Ruby中查找字符串是否以其他字符串开头?

Gui*_*oté 146 ruby string startswith

如果一个字符串在Ruby(没有rails)中以另一个字符串开头的最佳方法是什么?

ste*_*lag 239

puts 'abcdefg'.start_with?('abc')  #=> true
Run Code Online (Sandbox Code Playgroud)

[编辑]这是我在这个问题之前不知道的事情:start_with采取多个参数.

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
Run Code Online (Sandbox Code Playgroud)

  • 有趣的是,Rails定义了语法正确的`starts_with?`,它在1.8.7及以上版本中只是别名为`start_with?`. (7认同)

has*_*slo 54

由于这里介绍了几种方法,我想知道哪一种方法最快.使用Ruby 1.9.3p362:

irb(main):001:0> require 'benchmark'
=> true
irb(main):002:0> Benchmark.realtime { 1.upto(10000000) { "foobar"[/\Afoo/] }}
=> 12.477248
irb(main):003:0> Benchmark.realtime { 1.upto(10000000) { "foobar" =~ /\Afoo/ }}
=> 9.593959
irb(main):004:0> Benchmark.realtime { 1.upto(10000000) { "foobar"["foo"] }}
=> 9.086909
irb(main):005:0> Benchmark.realtime { 1.upto(10000000) { "foobar".start_with?("foo") }}
=> 6.973697
Run Code Online (Sandbox Code Playgroud)

所以看起来它start_with?是最快的.

使用Ruby 2.2.2p95和更新的机器更新了结果:

require 'benchmark'
Benchmark.bm do |x|
  x.report('regex[]')    { 10000000.times { "foobar"[/\Afoo/] }}
  x.report('regex')      { 10000000.times { "foobar" =~ /\Afoo/ }}
  x.report('[]')         { 10000000.times { "foobar"["foo"] }}
  x.report('start_with') { 10000000.times { "foobar".start_with?("foo") }}
end

            user       system     total       real
regex[]     4.020000   0.000000   4.020000 (  4.024469)
regex       3.160000   0.000000   3.160000 (  3.159543)
[]          2.930000   0.000000   2.930000 (  2.931889)
start_with  2.010000   0.000000   2.010000 (  2.008162)
Run Code Online (Sandbox Code Playgroud)

  • 因为编译和测试正则表达式比简单地比较字节要困难得多 (4认同)
  • @PeterP.我刚刚测试了不区分大小写的搜索,并且start_with?如果你只是将字符串写下来进行搜索然后与小写搜索字符串进行比较,那么仍然会出现:""FooBar".downcase.start_with?("foo")`. (3认同)

pak*_*eha 5

steenslag 提到的方法很简洁,考虑到问题的范围,它应该被认为是正确的答案。然而,还值得知道的是,这可以通过正则表达式来实现,如果您还不熟悉 Ruby,那么这是一项需要学习的重要技能。

玩一下 Rubular: http: //rubular.com/

但在这种情况下,如果左侧的字符串以“abc”开头,则以下 ruby​​ 语句将返回 true。右侧正则表达式中的 \A 表示“字符串的开头”。尝试一下 rubular——你就会清楚事情是如何运作的。

'abcdefg' =~  /\Aabc/ 
Run Code Online (Sandbox Code Playgroud)