2017-06-29 10 views
0

Stringに引数マッチングで/ regexが含まれている方法はありますか? たとえば、文字列は「何らかのエラーが発生しました」です。しかし、私はそれが "エラーが発生しました"という部分文字列と一致するようにしたい。私はこれを試してみましたが、それは動作しません:エリクシールメソッドの文字列と一致するパターンが含まれています

defp status({:error, ~r/error happened/}, state) do 

    end 

答えて

1

いいえ、どちらの文字列が含まれているにも正規表現マッチはパターンマッチングやガード機能のいずれかを使用して行うことができます。あなたの最善の策は、パターン内で{:error, error}とマッチさせることです。 cond

パターンマッチングで行うことができるのは、プレフィックスマッチです。それはあなたのために十分に良いことだ場合は、この操作を行うことができます。

defp status({:error, "error happened" <> _}, state) do 

これは"error happened"で始まる任意の文字列にマッチします。 @Dogbertによって答えが絶対的に正しいが

0

は、エラーメッセージが、たとえば、140個のシンボルよりも長くすることはできませんとき1を使用することができますトリックがある(別名さえずりサイズのエラーメッセージが。)

defmodule Test do 
    @pattern "error happened" 
    defp status({:error, @pattern <> _rest }, state), 
    do: IO.puts "Matched leading" 
    Enum.each(1..140, fn i -> 
    defp status({:error, 
       <<_ :: binary-size(unquote(i)), 
        unquote(@pattern) :: binary, 
        rest :: binary>>}, state), 
     do: IO.puts "Matched" 
    end) 
    Enum.each(0..140, fn i -> 
    defp status({:error, <<_ :: binary-size(unquote(i))>>}, state), 
     do: IO.puts "Unmatched" 
    end) 
    # fallback 
    defp status({:error, message}, state) do 
    cond do 
     message =~ "error happened" -> IO.puts "Matched >140" 
     true -> IO.puts "Unatched >140" 
    end 
    end 

    def test_status({:error, message}, state), 
    do: status({:error, message}, state) 
end 

試験:

iex|1 ▶ Test.test_status {:error, "sdf error happened sdfasdf"}, nil 
Matched 

iex|2 ▶ Test.test_status {:error, "sdf errors happened sdfasdf"}, nil 
Unmatched 

iex|3 ▶ Test.test_status {:error, "error happened sdfasdf"}, nil  
Matched leading 

iex|4 ▶ Test.test_status {:error, 
...|4 ▷ String.duplicate(" ", 141) <> "error happened sdfasdf"}, nil 
Matched >140 
関連する問題