Ruby에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법


731

내용이있는 문자열 변수가 있습니다.

varMessage =   
            "hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"


            "/my/name/is/balaji.so\n"
            "call::myFunction(int const&)\n"
            "void::secondFunction(char const&)\n"
             .
             .
             .
            "this/is/last/line/liobrary.so"

문자열에서 하위 문자열을 찾아야합니다.

"hi/thsid/sdfhsjdf/dfjsd/sdjfsdn\n"

"/my/name/is/balaji.so\n"
"call::myFunction(int const&)\n"

어떻게 찾을 수 있습니까? 하위 문자열이 있는지 여부를 확인해야합니다.



이를 수행하는 다양한 방법에 대한 자세한 내용은 stackoverflow.com/a/3878656/128421 을 참조하십시오 .
Tin Man

답변:


1364

다음 include?방법을 사용할 수 있습니다 .

my_string = "abcdefg"
if my_string.include? "cde"
   puts "String includes 'cde'"
end

102
include?대소 문자를 구분 한다는 것을 기억하십시오 . 따라서 my_string위의 예에서 "abcDefg"(대문자 포함 D)와 include?("cde")같으면을 반환 false합니다. 당신은 downcase()전화하기 전에 할 수 있습니다 include?().
phortx

4
nil test = nil test.include? ( "test") NoMethodError : 정의되지 않은 메소드`include? '인 경우 NoMethodError를 발생시킬 수 있으므로 자체 포함이 이상적이지 않습니다. nil : NilClass의 경우 항상 포함되는 값을 예상 값으로 변환해야합니다 .- test.to_s.include? ( "test")
Gary

코드의이 부분에서 발생하는 예외를 최소화하는 것이 목표 인 경우 @Gary의 조언이 유지 됩니다 . 이것이 항상 최고의 목표는 아닙니다. 일반적으로 코드 에서이 시점에서 문자열을 예상하고 대신 값이 nil 인 경우 예기치 않은 일이 발생했으며 예외가 발생한다는 것을 의미합니다. 여기에 nil이 존재하지 않으면를 사용 to_s하면 문제를 숨기고 소스와 문제 감지 사이의 거리가 증가하여 디버그하기가 더 어려워집니다.
루크 그리피스

88

대소 문자가 관련이 없으면 대소 문자를 구분하지 않는 정규식 이 좋은 해결책입니다.

'aBcDe' =~ /bcd/i  # evaluates as true

이것은 여러 줄 문자열에도 적용됩니다.

자세한 내용은 Ruby의 Regexp 클래스를 참조하십시오.


11
사용자 입력과 일치하고이 기술을 사용 Regexp.escape하는 경우 문자열 에서 사용해야 합니다. 대부분의 사용 사례에서 some_str.include? substr.downcase()더 빠르게 작동하고 더 읽기 쉬워야합니다.
Jack

4
이런 식으로 정규 표현식을 사용하는 것이 반드시를 사용하는 것보다 빠를 필요는 없습니다 'aBcDe'.downcase.include?('bcd'). 정규식은 목적이 있지만 내장 방법이 더 빠를 때는 사용하지 마십시오. 테스트중인 실제 데이터로 벤치마킹하면 많은 것을 알 수 있습니다.
Tin Man

3
이것은 사실로 평가되지 않습니다. 사실이 아닌 1로 평가됩니다.
slindsey3000

2
!! ( 'aBcDe'= ~ / bcd / i)는 true 또는 false로 평가됩니다. 사용 !! 관용구
slindsey3000

2
또는 match를 사용 하시겠습니까? 부울을 반환하려면 :/bcd/i.match?('aBcDe')
ferrell_io

45

당신은 또한 이것을 할 수 있습니다 ...

my_string = "Hello world"

if my_string["Hello"]
  puts 'It has "Hello"'
else
  puts 'No "Hello" found'
end

# => 'It has "Hello"'

이 예제는 Ruby의 String #[]메소드를 사용합니다.


2
이것은 내가 전에 보지 못한 깔끔한 트릭입니다. 그러나 #include?여전히 조금 더 빠릅니다.
Scott Schupbach

4
#include?#include문장이 단어로 분할 된 다음 단어를 별도의 배열 값으로 사용 하기 때문에 공백이있는 문장으로 작업 할 때는 작동하지 않습니다 . 이것은 문장에 완벽하게 작동합니다. +1
luissimo

자세한 정보는 Ruby의 String []메소드를 참조하십시오.
Tin Man

32

클린트 Pachl의 답변을 확장 :

nil표현식이 일치하지 않으면 Ruby에서 정규식 일치가 반환 됩니다. 일치하면 일치하는 문자의 색인을 리턴합니다. 예를 들면 다음과 같습니다.

"foobar" =~ /bar/  # returns 3
"foobar" =~ /foo/  # returns 0
"foobar" =~ /zzz/  # returns nil

Ruby에서만 nil부울 표현식 false이 false로 평가 된다는 점에 유의해야합니다 . 빈 배열, 빈 해시 또는 정수 0을 포함한 다른 모든 항목은 true로 평가됩니다.

이것이 /foo/위 의 예가 작동하는 이유와 그 이유입니다.

if "string" =~ /regex/

if일치하는 경우 블록 의 '참'부분 만 입력하면 예상대로 작동합니다 .


21

Rails에서 사용할 수있는 위의 허용 된 답변 (3.1.0 이상)보다 간결한 관용구는 .in?다음 과 같습니다.

my_string = "abcdefg"
if "cde".in? my_string
  puts "'cde' is in the String."
  puts "i.e. String includes 'cde'"
end

또한 더 읽기 쉽다고 생각합니다.

자세한 내용은 in?설명서를 참조하십시오.

파일Rails 에서만 사용할 수 있으며 순수한 Ruby는 아닙니다.


2
이것은 레일에 의존하며 OP는 루비 솔루션을 요청했습니다
dft

2
맞습니다. Ruby 개발자의 상당 부분이 Rails를 사용하고 있기 때문에 이것이 명확성과 간결성으로 인해 이것이 선호되는 솔루션이라고 생각했습니다.
stwr667

1
stackoverflow.com/a/4239625/128421을 참조하십시오 . Rails에 있지만 Rails의 Active Support Core Extensions 를 사용하여 일반 Ruby에서 쉽게 액세스 할 수 있습니다 in?.
Tin Man

@theTinMan을 정정하십시오. "cde".in? my_string순수한 루비 수율로 NoMethodError. 그러나 Rails 자체 또는 컷 다운 Active Support Core Extensionsrequire 'active_support/core_ext/object/inclusion' 에서로드 할 수 있습니다 .
stwr667

16

삼원 방법

my_string.include?('ahr') ? (puts 'String includes ahr') : (puts 'String does not include ahr')

또는

puts (my_string.include?('ahr') ? 'String includes ahr' : 'String not includes ahr')

11

String Element Reference 메소드를 사용할 수 있습니다.[]

안에는 []리터럴 하위 문자열, 인덱스 또는 정규 표현식이 있습니다.

> s='abcdefg'
=> "abcdefg"
> s['a']
=> "a"
> s['z']
=> nil

때문에 nil기능적으로 동일로 false와에서 반환 된 문자열은 []입니다 true당신이 방법을 사용하는 것처럼이 논리를 사용할 수 있습니다 .include?:

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" has "abc"

0> if s[sub_s]
1>    puts "\"#{s}\" has \"#{sub_s}\""
1> else 
1*    puts "\"#{s}\" does not have \"#{sub_s}\""
1> end
"abcdefg" does not have "xyz" 

색인을 하위 문자열과 혼동하지 마십시오.

> '123456790'[8]    # integer is eighth element, or '0'
=> "0"              # would test as 'true' in Ruby
> '123456790'['8']  
=> nil              # correct

정규식을 사용할 수도 있습니다.

> s[/A/i]
=> "a"
> s[/A/]
=> nil

2
이것은 경이
Craig

3

Ruby에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법은 무엇입니까?

'check'라고 말하면 부울을 반환한다고 가정합니다 String#match?. 이 경우 사용할 수 있습니다 . match?문자열이나 정규 표현식을 첫 번째 매개 변수로 받아들입니다. 전자의 경우 정규 표현식으로 자동 변환됩니다. 따라서 사용 사례는 다음과 같습니다.

str = 'string'
str.match? 'strings' #=> false
str.match? 'string'  #=> true
str.match? 'strin'   #=> true
str.match? 'trin'    #=> true
str.match? 'tri'     #=> true

String#match?문자열을 검색 할 색인을 지정하는 선택적 두 번째 인수의 추가 이점이 있습니다. 기본적으로이 설정되어 0있습니다.

str.match? 'tri',0   #=> true
str.match? 'tri',1   #=> true
str.match? 'tri',2   #=> false

2
user_input = gets.chomp
user_input.downcase!

if user_input.include?('substring')
  # Do something
end

문자열에 하위 문자열이 포함되어 있는지 확인하는 데 도움이됩니다.

puts "Enter a string"
user_input = gets.chomp  # Ex: Tommy
user_input.downcase!    #  tommy


if user_input.include?('s')
    puts "Found"
else
    puts "Not found"
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.