【问题标题】:How do I find if a string starts with another string in Ruby?如何在 Ruby 中查找一个字符串是否以另一个字符串开头?
【发布时间】:2011-05-09 06:52:57
【问题描述】:

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

【问题讨论】:

标签: ruby string startswith


【解决方案1】:
puts 'abcdefg'.start_with?('abc')  #=> true

[编辑] 这是我在这个问题之前不知道的:start_with 接受多个参数。

'abcdefg'.start_with?( 'xyz', 'opq', 'ab')

【讨论】:

  • MRI 1.8.7 没有start_with?,但 MRI 1.9 有,Rails 也有。
  • @Wayne Conrad:奇怪的是,1.8.7 确实String#start_with?的文档。
  • @Jörg W Mittag,也许并不奇怪,我错了。 MRI 1.8.7 确实有start_with?。我想我在加载 irb 尝试时打错了。
  • 有趣的是,Rails 定义了语法正确的 starts_with?,在 1.8.7 及更高版本中,它只是别名为 start_with?
【解决方案2】:

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

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

但是在这种情况下,如果左边的字符串以 'abc' 开头,则以下 ruby​​ 语句将返回 true。右侧正则表达式文字中的 \A 表示“字符串的开头”。玩一下 rubular - 事情的运作方式会变得很清楚。

'abcdefg' =~  /\Aabc/ 

【讨论】:

  • 正如 Wayne Conrad 所指出的,这种方法也适用于比 start_with 更广泛的运行时。
【解决方案3】:

我喜欢

if ('string'[/^str/]) ...

【讨论】:

  • 你应该在这里使用[/\Astr/]。您的正则表达式也匹配 "another\nstring"
【解决方案4】:

由于这里介绍了几种方法,所以我想弄清楚哪种方法最快。使用 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

所以看起来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)

【讨论】:

  • 并不奇怪,因为正则表达式的编译和测试比简单地比较字节要难得多
  • 应该注意的是,Regex 对于不区分大小写的搜索要好得多,即使您提前计算了测试字符串的所有大小写排列。
  • @PeterP。我刚刚测试了不区分大小写的搜索,并且 start_with?如果您只是将要搜索的字符串小写然后与小写搜索字符串进行比较,仍然会领先:"FooBar".downcase.start_with?("foo").
猜你喜欢
  • 2017-11-27
  • 2011-06-13
  • 2013-09-04
  • 2011-12-07
  • 1970-01-01
  • 2012-02-09
  • 2010-10-30
  • 1970-01-01
  • 2013-05-16
相关资源
最近更新 更多