Re: Binary String pattern matching
Karl Velicka <[email protected]>
| Newsgroups | gmane.comp.lang.erlang.general |
|---|---|
| Message-ID | <CANxL2L4awBG_0+YEstbN0bk1cnZGhX7zRz08MoxE8BzFDq7Keg@mail.gmail.com> |
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 <[email protected]> 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 < > [email protected]> έγραψε: > >> 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 <[email protected]> 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 < >>> [email protected]> έγραψε: >>> >>>> 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 <[email protected]> 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 < >>>>> [email protected]> έγραψε: >>>>> >>>>>> 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 < >>>>>> [email protected]> 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 < >>>>>> [email protected]> έγραψε: >>>>>> >>>>>>> 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 >>>>>>> >>>>>> >>>>>>