首页 文章

如何检查字符串是否包含Ruby中的子字符串?

提问于
浏览
621

我有一个字符串变量,内容如下:

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"

我该怎么找到它?我只需要确定子串是否存在 .

9 回答

  • 1162

    扩展Clint Pachl的答案:

    当表达式不匹配时,Ruby中的正则表达式匹配返回 nil . 如果是,则返回匹配发生的字符的索引 . 例如

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

    重要的是要注意,在Ruby中只有nil和布尔表达式false求值为false . 其他所有内容(包括空数组,空哈希或整数0)的计算结果为true .

    这就是为什么上面的/ foo /示例有效,以及为什么

    if "string" =~ /regex/
    

    按预期工作 . 如果匹配发生,仅输入if块的“true”部分 .

  • 27

    你也可以这样做......

    my_string = "Hello world"
    
    if my_string["Hello"]
      puts 'It has "Hello"'
    else
      puts 'No "Hello" found'
    end
    
    # => 'It has "Hello"'
    
  • 15

    如果情况无关紧要,那么 case-insensitive regular expression 是一个很好的解决方案:

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

    这也适用于多行字符串 .

    请参阅Ruby的Regexp类 .

  • 3

    您可以使用include?方法:

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

    三元方式

    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')
    
  • 7

    如何检查字符串是否包含Ruby中的子字符串?

    当你说'check'时,我假设你想要一个返回的布尔值,在这种情况下你可以使用String#match? . match? 接受字符串或正则表达式作为其第一个参数,如果's the former then it'自动转换为正则表达式 . 所以你的用例是:

    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
    
  • 14

    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
    

    我也认为它更具可读性 .

    C.F. http://apidock.com/rails/v3.1.0/Object/in%3F

    (请注意,它仅在 Rails 中可用,而不是纯Ruby . )

  • 74
    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
    
  • 1

    您可以使用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
    

相关问题