วิธีที่ดีที่สุดในการค้นหาว่าสตริงเริ่มต้นด้วยอื่นใน Ruby (ไม่มีทางรถไฟ) คืออะไร?
วิธีที่ดีที่สุดในการค้นหาว่าสตริงเริ่มต้นด้วยอื่นใน Ruby (ไม่มีทางรถไฟ) คืออะไร?
คำตอบ:
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?
และสูงกว่าเป็นเพียงนามแฝง
เนื่องจากมีวิธีการหลายวิธีที่นำเสนอที่นี่ฉันต้องการที่จะหาวิธีที่เร็ว ใช้ 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")
สตริงเพื่อค้นหาและจากนั้นเปรียบเทียบกับสตริงการค้นหาตัวพิมพ์เล็ก:
วิธีการที่กล่าวถึงโดย steenslag นั้นสั้นและได้รับขอบเขตของคำถามก็ควรพิจารณาคำตอบที่ถูกต้อง อย่างไรก็ตามมันก็คุ้มค่าที่จะรู้ว่าสิ่งนี้สามารถเกิดขึ้นได้ด้วยการแสดงออกปกติซึ่งหากคุณไม่คุ้นเคยกับใน Ruby เป็นทักษะที่สำคัญในการเรียนรู้
เล่นกับ Rubular: http://rubular.com/
แต่ในกรณีนี้คำสั่ง ruby ต่อไปนี้จะคืนค่าจริงถ้าสตริงทางด้านซ้ายเริ่มต้นด้วย 'abc' \ A ในตัวอักษร regex ทางด้านขวาหมายถึง 'จุดเริ่มต้นของสตริง' เล่นด้วย rubular - มันจะกลายเป็นที่ชัดเจนว่าสิ่งที่ทำงาน
'abcdefg' =~ /\Aabc/
ฉันชอบ
if ('string'[/^str/]) ...
[/\Astr/]
ที่นี่ regex "another\nstring"
ของคุณยังตรงกับ