ฉันจะค้นหาได้อย่างไรว่าสตริงเริ่มต้นด้วยสตริงอื่นในรูบี?


คำตอบ:


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

@Wayne คอนราด: แปลก 1.8.7 จะString#start_with?มีเอกสารสำหรับ
Jörg W Mittag

@ Jörg W Mittag บางทีอาจไม่แปลกเลยฉันผิด MRI 1.8.7 start_with?ไม่แน่นอนมี ฉันคิดว่าฉันพิมพ์ผิดเมื่อฉันโหลด irb เพื่อลอง
Wayne Conrad

7
ที่น่าสนใจ Rails กำหนดที่ถูกต้อง grammaticaly starts_with?ซึ่ง 1.8.7 start_with?และสูงกว่าเป็นเพียงนามแฝง
Mark Thomas

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

1
ควรสังเกตว่า Regex นั้นเหนือกว่าสำหรับการค้นหาแบบคำนึงถึงขนาดตัวพิมพ์แม้ว่าคุณจะคำนวณจำนวนพีชคณิตทั้งหมดของสตริงการทดสอบล่วงหน้าแล้วก็ตาม
Peter P.

3
@PeterP ฉันเพิ่งทดสอบการค้นหาแบบไม่สนใจขนาดตัวพิมพ์และ start_with? ยังคงออกมาข้างหน้าถ้าคุณเพียงแค่ downcase "FooBar".downcase.start_with?("foo")สตริงเพื่อค้นหาและจากนั้นเปรียบเทียบกับสตริงการค้นหาตัวพิมพ์เล็ก:
haslo

4

วิธีการที่กล่าวถึงโดย steenslag นั้นสั้นและได้รับขอบเขตของคำถามก็ควรพิจารณาคำตอบที่ถูกต้อง อย่างไรก็ตามมันก็คุ้มค่าที่จะรู้ว่าสิ่งนี้สามารถเกิดขึ้นได้ด้วยการแสดงออกปกติซึ่งหากคุณไม่คุ้นเคยกับใน Ruby เป็นทักษะที่สำคัญในการเรียนรู้

เล่นกับ Rubular: http://rubular.com/

แต่ในกรณีนี้คำสั่ง ruby ​​ต่อไปนี้จะคืนค่าจริงถ้าสตริงทางด้านซ้ายเริ่มต้นด้วย 'abc' \ A ในตัวอักษร regex ทางด้านขวาหมายถึง 'จุดเริ่มต้นของสตริง' เล่นด้วย rubular - มันจะกลายเป็นที่ชัดเจนว่าสิ่งที่ทำงาน

'abcdefg' =~  /\Aabc/ 

ดังที่เวย์นคอนราดชี้ให้เห็นวิธีการนี้จะทำงานในช่วงเวลาที่หลากหลายกว่า start_with
pakeha

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.