루비에서 문자열이 다른 문자열로 시작하는지 어떻게 알 수 있습니까?


답변:


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 에는 없습니다 .
Wayne Conrad

@Wayne 콘래드 : 이상하게도, 1.8.7는 않습니다 에 대한 설명서가 String#start_with?.
Jörg W Mittag 2011

@ Jörg W Mittag, 아마도 이상하게도, 나는 틀렸다. MRI 1.8.7에는 실제로 있습니다 start_with?. 나는 그것을 시도하기 위해 irb를로드 할 때 오타가있는 것 같아요.
Wayne Conrad

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

1
테스트 문자열에 대한 모든 케이스 순열을 미리 계산하더라도 Regex는 대소 문자를 구분하지 않는 검색에 훨씬 우수합니다.
Peter P.

3
@PeterP. 대소 문자를 구분하지 않는 검색을 테스트했으며 start_with? 검색 할 문자열을 소문자로 바꾸고 소문자 검색 문자열과 비교하면 여전히 나옵니다 "FooBar".downcase.start_with?("foo").
haslo

4

steenslag가 언급 한 방법은 간결하며 질문의 범위가 주어지면 정답으로 간주해야합니다. 그러나 정규 표현식으로도 달성 할 수 있다는 것을 아는 것도 가치가 있습니다. 루비에 익숙하지 않다면 배우는 중요한 기술입니다.

Rubular와 함께 플레이 : http://rubular.com/

그러나이 경우 왼쪽의 문자열이 'abc'로 시작하면 다음 루비 명령문이 true를 리턴합니다. 오른쪽의 정규 표현식 리터럴에서 \ A는 '문자열의 시작'을 의미합니다. 루블과 놀아보십시오-일이 어떻게 작동하는지 분명해질 것입니다.

'abcdefg' =~  /\Aabc/ 

Wayne Conrad가 지적한 것처럼이 방법은 start_with will보다 다양한 런타임에서도 작동합니다.
pakeha

2

나는 좋아한다

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

8
[/\Astr/]여기서 사용해야합니다 . 정규식도 일치 "another\nstring"합니다.
haslo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.