Binary String pattern matching

Java House java4dev@REDACTED
Thu Dec 10 15:57:14 CET 2020


Thank you for the proposal, I will try that as well.
In the meantime I did this
currrency_to_credits({cur, Value}, Acc) ->
Regexp = "(.*)(CHF|EUR|US)",
{ok, MP} = re:compile(Regexp),
case re:run(Value, MP, [global, {capture,[1,2], binary}]) of
{match,[[V,C]]} -> currrency_to_credits(cur, V, U, Acc);
nomatch -> Acc
end;

Στις Πέμ, 10 Δεκ 2020 στις 9:04 π.μ., ο/η Valdimar Kristjánsson <
nisbus@REDACTED> έγραψε:

> You could reverse it first and then match on the reversed symbol:
>
> Data from the provider:
>
>> Reversed = list_to_binary(lists:reverse(binary_to_list(<<"1234EUR">>))).
>
>
>
> Reverse the Currency name in the match
>
>>  currency_to_credits({cur, <<"RUE", Reversed/binary>>}, Acc) ->
>>    {eur, Acc + A};
>
>
> Probably not the most performant but at least it solves the problem.
>
> Best,
> nisbus
>
> On Thu, Dec 10, 2020 at 8:16 AM Java House <java4dev@REDACTED> wrote:
>
>> Hi
>>
>> yes the binary string is of the format <<"xxx">>
>>
>> <<"3123CHF">>
>>> <<"341424343EUR">>
>>> <<"14143US">>
>>>
>>  Thank you for the answer.
>> So is there any other way?
>> erlang provides the binary_to_list, is there any way to achieve the same
>> with a list becasue I tried similare patterns with list and it does not
>> work e.g
>> [V|T] this will always match the first character of the string to V
>> and [V|"CHF"] does not work neither.
>>
>> Best
>> Nikolas
>>
>> Στις Τετ, 9 Δεκ 2020 στις 7:58 μ.μ., ο/η kuna.prime <
>> kuna.prime@REDACTED> έγραψε:
>>
>>> HI,
>>>
>>> first of all binary string is of form <<"3123CHF">> and not <<3123CHF>>
>>> i'm just stating it in case there was a mistake in the first mail
>>>
>>> to answer your questio in order to pattern match you need to know the
>>> size of field you are matching so
>>>
>>> <<X:4/binary, "CHF">> = <<"3123CHF">>.
>>>
>>> will match fist 4 bytes and interpret that as new binary (X).
>>>
>>>
>>> Sent with ProtonMail <https://protonmail.com> Secure Email.
>>>
>>> ‐‐‐‐‐‐‐ Original Message ‐‐‐‐‐‐‐
>>> On Wednesday, December 9, 2020 7:28 PM, Java House <java4dev@REDACTED>
>>> wrote:
>>>
>>> there is a typo in the example
>>> currrency_to_credits({cur, << Value , "CHF">>}, Acc)
>>>   when Value >= <<"1000">>, Value =< <<"10000">> ->
>>>      {chf, Acc + Value };
>>> currrency_to_credits({cur, << Value , "EUR">>}, Acc)
>>>   when Value >= <<"1000">>, Value =< <<"10000">> ->
>>>      {eur, Acc + Value };
>>> currrency_to_credits({cur, << Value , "US">>}, Acc)
>>>   when Value >= <<"1000">>, Value =< <<"10000">> ->
>>>      {us, Acc + Value };
>>>
>>> Στις Τετ, 9 Δεκ 2020 στις 7:17 μ.μ., ο/η Java House <java4dev@REDACTED>
>>> έγραψε:
>>>
>>>> Hello all
>>>>
>>>> I am learning Erlang and have stuck to the following problem.
>>>> How to write a function with pattern matching when the parameter is a
>>>> binary string.
>>>>
>>>> I have a list of binary strings e.g.
>>>> <<3123CHF>>
>>>> <<341424343EUR>>
>>>> <<14143US>>
>>>>
>>>> I am trying to create a function that matches according to a pattern.
>>>>
>>>> currrency_to_credits({cur, <<A, "CHF">>}, Acc)
>>>>   when Value >= <<"1000">>, Value =< <<"10000">> ->
>>>>      {chf, Acc + A};
>>>> currrency_to_credits({cur, <<A, "EUR">>}, Acc)
>>>>   when Value >= <<"1000">>, Value =< <<"10000">> ->
>>>>      {eur, Acc + A};
>>>> currrency_to_credits({cur, <<A, "US">>}, Acc)
>>>>   when Value >= <<"1000">>, Value =< <<"10000">> ->
>>>>      {us, Acc + A};
>>>>
>>>> But this does not seem to be the right way.
>>>> How can I create a pattern for binary string?
>>>> will it work better for list string? How?
>>>>
>>>> Thank you
>>>> Nikolas
>>>>
>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20201210/ecd43e25/attachment.htm>


More information about the erlang-questions mailing list