Stringに引数マッチングで/ regexが含まれている方法はありますか? たとえば、文字列は「何らかのエラーが発生しました」です。しかし、私はそれが "エラーが発生しました"という部分文字列と一致するようにしたい。私はこれを試してみましたが、それは動作しません:エリクシールメソッドの文字列と一致するパターンが含まれています
defp status({:error, ~r/error happened/}, state) do
end
Stringに引数マッチングで/ regexが含まれている方法はありますか? たとえば、文字列は「何らかのエラーが発生しました」です。しかし、私はそれが "エラーが発生しました"という部分文字列と一致するようにしたい。私はこれを試してみましたが、それは動作しません:エリクシールメソッドの文字列と一致するパターンが含まれています
defp status({:error, ~r/error happened/}, state) do
end
いいえ、どちらの文字列が含まれているにも正規表現マッチはパターンマッチングやガード機能のいずれかを使用して行うことができます。あなたの最善の策は、パターン内で{:error, error}
とマッチさせることです。 cond
:
パターンマッチングで行うことができるのは、プレフィックスマッチです。それはあなたのために十分に良いことだ場合は、この操作を行うことができます。
defp status({:error, "error happened" <> _}, state) do
これは"error happened"
で始まる任意の文字列にマッチします。 @Dogbertによって答えが絶対的に正しいが
は、エラーメッセージが、たとえば、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