【发布时间】:2011-05-09 06:52:57
【问题描述】:
在 Ruby 中查找一个字符串是否以另一个字符串开头的最佳方法是什么(没有 rails)?
【问题讨论】:
标签: ruby string startswith
在 Ruby 中查找一个字符串是否以另一个字符串开头的最佳方法是什么(没有 rails)?
【问题讨论】:
标签: ruby string startswith
puts 'abcdefg'.start_with?('abc') #=> true
[编辑] 这是我在这个问题之前不知道的:start_with 接受多个参数。
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
【讨论】:
start_with?,但 MRI 1.9 有,Rails 也有。
String#start_with?的文档。
start_with?。我想我在加载 irb 尝试时打错了。
starts_with?,在 1.8.7 及更高版本中,它只是别名为 start_with?。
steenslag 提到的方法很简洁,考虑到问题的范围,它应该被认为是正确的答案。然而,同样值得知道的是,这可以通过正则表达式来实现,如果您还不熟悉 Ruby,这是一项重要的学习技能。
玩一下 Rubular:http://rubular.com/
但是在这种情况下,如果左边的字符串以 'abc' 开头,则以下 ruby 语句将返回 true。右侧正则表达式文字中的 \A 表示“字符串的开头”。玩一下 rubular - 事情的运作方式会变得很清楚。
'abcdefg' =~ /\Aabc/
【讨论】:
我喜欢
if ('string'[/^str/]) ...
【讨论】:
[/\Astr/]。您的正则表达式也匹配 "another\nstring"。
由于这里介绍了几种方法,所以我想弄清楚哪种方法最快。使用 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)
【讨论】:
"FooBar".downcase.start_with?("foo").