如何在Ruby中找到一个字符串是否以另一个字符串开头?


Answers:


254
puts 'abcdefg'.start_with?('abc')  #=> true

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

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

1
MRI 1.8.7没有start_with?,但MRI 1.9和Rails一样。
韦恩·康拉德

@Wayne Conrad:奇怪的是,1.8.7 确实有的文档String#start_with?
约尔格W¯¯米塔格

@JörgW Mittag,也许并不奇怪,我错了。MRI 1.8.7确实具有start_with?。我猜我在加载irb尝试时输入了错误。
韦恩·康拉德

7
有趣的是,Rails定义了语法正确starts_with?,在1.8.7及更高版本中,它只是别名为start_with?
马克·托马斯

56

由于此处介绍了几种方法,因此我想找出哪种方法最快。使用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)

4
不足为奇,因为正则表达式的编译和测试要比简单地比较字节难得多
akostadinov 2014年

1
应该注意的是,即使您提前计算了测试字符串的所有大小写排列,Regex对于不区分大小写的搜索也要优越得多。
Peter P.

3
@PeterP。我刚刚测试了不区分大小写的搜索,以及start_with?如果只是将要搜索的字符串小写然后与小写的搜索字符串进行比较,则仍然会领先"FooBar".downcase.start_with?("foo")
哈斯洛

4

steenslag提到的方法很简洁,鉴于问题的范围,应将其视为正确的答案。但是,也值得知道的是,可以通过正则表达式来实现,如果您对Ruby不熟悉,那么正则表达式是一项重要的学习技能。

玩Rubular:http: //rubular.com/

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

'abcdefg' =~  /\Aabc/ 

正如Wayne Conrad指出的那样,与start_with相比,该方法还将在更广泛的运行时中运行。
pakeha 2010年

2

我喜欢

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

8
您应该在[/\Astr/]这里使用。您的正则表达式也匹配"another\nstring"
haslo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.