Binary String pattern matching

Karl Velicka karolis.velicka@REDACTED
Thu Dec 10 17:25:57 CET 2020


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/ecdba28c/attachment.htm>


More information about the erlang-questions mailing list