diff --git a/apps/emqx_utils/src/emqx_variform_bif.erl b/apps/emqx_utils/src/emqx_variform_bif.erl index ed9dfb851..f30db8f7a 100644 --- a/apps/emqx_utils/src/emqx_variform_bif.erl +++ b/apps/emqx_utils/src/emqx_variform_bif.erl @@ -199,20 +199,24 @@ regex_match(Str, RE) -> regex_replace(SrcStr, RE, RepStr) -> re:replace(SrcStr, RE, RepStr, [global, {return, binary}]). -%% @doc Searches the string Str for patterns specified by Regexp. +%% @doc Non-global search for specified regular expression pattern in the given string. %% If matches are found, it returns a list of all captured groups from these matches. %% If no matches are found or there are no groups captured, it returns an empty list. %% This function can be used to extract parts of a string based on a regular expression, %% excluding the complete match itself. +%% %% Examples: %% ("Number: 12345", "(\\d+)") -> [<<"12345">>] -%% ("Hello, world!", "(\\w+)") -> [<<"Hello">>, <<"world">>] +%% ("Hello, world!", "(\\w+).*\s(\\w+)") -> [<<"Hello">>, <<"world">>] %% ("No numbers here!", "(\\d+)") -> [] %% ("Date: 2021-05-20", "(\\d{4})-(\\d{2})-(\\d{2})") -> [<<"2021">>, <<"05">>, <<"20">>] +-spec regex_extract(string() | binary(), string() | binary()) -> [binary()]. regex_extract(Str, Regexp) -> - case re:run(Str, Regexp, [{capture, all_but_first, list}]) of - {match, [_ | _] = L} -> lists:map(fun erlang:iolist_to_binary/1, L); - _ -> [] + case re:run(Str, Regexp, [{capture, all_but_first, binary}]) of + {match, CapturedGroups} -> + CapturedGroups; + _ -> + [] end. ascii(Char) when is_binary(Char) ->