在 Ruby 中,如果一个字符串以另一个字符串开始(没有 Rails) ,找到这个字符串的最佳方法是什么?
puts 'abcdefg'.start_with?('abc') #=> true
[ edit ]在这个问题之前我不知道: start_with采用多个参数。
start_with
'abcdefg'.start_with?( 'xyz', 'opq', 'ab')
斯滕斯拉格提到的方法很简洁,考虑到问题的范围,它应该被认为是正确的答案。然而,值得一提的是,正则表达式可以实现这一点,如果您还不熟悉 Ruby,那么正则表达式是一项需要学习的重要技能。
使用 Rubular: http://rubular.com/
但是在这种情况下,如果左边的字符串以‘ abc’开头,那么下面的 ruby 语句将返回 true。右边 regex 文字中的 A 表示“字符串的开头”。有一个发挥与卢布-它会变得清楚的事情是如何工作的。
'abcdefg' =~ /\Aabc/
我喜欢
if ('string'[/^str/]) ...
由于这里提供了几种方法,我想弄清楚哪一种是最快的。使用 Ruby 1.9.3 p362:
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?是最快的。
start_with?
使用 Ruby 2.2.2 p95和更新的机器更新了结果:
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)