Binary String pattern matching

Karl Velicka karolis.velicka@REDACTED
Thu Dec 10 19:27:35 CET 2020


I meant the latter - you can save it in the state of your gen_server or
whatever process that is doing the parsing.

On Thu, 10 Dec 2020 at 17:45, Java House <java4dev@REDACTED> wrote:

> Thank you for the tip.
> Is there any way to do it on the module level, or did you mean to just
> create the regex and compile it before start checking the list of records?
>
> Στις Πέμ, 10 Δεκ 2020 στις 5:26 μ.μ., ο/η Karl Velicka <
> karolis.velicka@REDACTED> έγραψε:
>
>> Hi,
>>
>> If you're going with compiled regex, you should probably pass it to the
>> function and cache it somewhere outside - as it stands, you keep
>> recompiling the regex for every invocation of your parser which may well be
>> slower than just not bothering to compile it at all.
>>
>> Karl
>>
>> On Thu, 10 Dec 2020 at 14:57, Java House <java4dev@REDACTED> wrote:
>>
>>> 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/1e6af36b/attachment.htm>


More information about the erlang-questions mailing list