代码之家  ›  专栏  ›  技术社区  ›  s3cur3 Aleksei Matiushkin

Elixir位字符串包含子位字符串

  •  0
  • s3cur3 Aleksei Matiushkin  · 技术社区  · 6 年前

    if MyBitstringModule.contains(<<1, 2, 3, 4, 5>>, <<2, 3, 4>>) do
      # do stuff
    end
    

    如果我有 二进制文件 the =~ operator String.contains?/2

    到目前为止,我所想到的最好的方法是这样的递归模式匹配(实际上不起作用!),这看起来像是一个骗局:

    def contains(haystack, needle) when is_bitstring(haystack) and is_bitstring(needle) do
      needle_size = bit_size(needle)
      case haystack do
        <<>> -> false
        <<^needle::size(needle_size), _::bitstring>> -> true
        <<_::size(1), remainder::bitstring>> -> contains(remainder, needle)
      end
    end
    

    [请注意,尽管标题大致相同,但实际上并不是 this question 二进制文件

    iex> contains(<<1, 2, 3, 4, 5, 1::size(1)>>, <<2, 3, 4>>)
    true
    iex> contains(<<1, 2, 3, 4, 5, 1::size(1)>>, <<4, 5, 1::size(1)>>)
    true
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Brett Beatty    6 年前

    bitstring 输入真实案例

    <<^needle::bitstring-size(needle_size), _::bitstring>> -> true
    

    iex> needle = <<3, 4, 5>>
    <<3, 4, 5>>
    iex> needle_size = bit_size(needle)
    24
    iex> <<^needle::size(needle_size), _::bitstring>> = <<3, 4, 5>>
    ** (MatchError) no match of right hand side value: <<3, 4, 5>>
    iex> <<^needle::bitstring-size(needle_size), _::bitstring>> = <<3, 4, 5>>
    <<3, 4, 5>>