2017-06-29 1 views
0

Existe-t-il un moyen pour que String contienne/regex dans la correspondance des arguments? Par exemple, la chaîne est "Une erreur s'est produite". Mais je veux que cela corresponde à la sous-chaîne "erreur". J'ai essayé cela, mais il ne fonctionne pas:Le modèle de méthode Elixir correspondant à la chaîne contient

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

    end 

Répondre

1

Non, ni chaîne contient ni correspondance Regex peut être fait en utilisant soit la recherche de motifs ou fonctions de garde. Votre meilleur pari serait de faire correspondre {:error, error} dans le modèle et faire la chaîne correspondant à l'intérieur de la fonction en utilisant par exemple. cond:

defp status({:error, error}, state) do 
    cond do 
    error =~ "error happened" -> ... 
    ... 
    end 
end 

Que peut-on faire en correspondance de motif est un match de préfixe. Si c'est assez bon pour vous, vous pouvez le faire:

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

Cela correspondra à toute chaîne commençant par "error happened".

0

Bien que la réponse par @Dogbert est tout à fait correcte, il y a un truc, on pourrait utiliser lorsque des messages d'erreur ne peut pas être plus que, disons, 140 symboles (messages d'erreur alias twitter taille.)

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 

Tests:

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