Лучший способ добиться этого - вообще не использовать регулярные выражения, как это можно легко сделать с помощью сопоставления с образцом (если вам не нужно обрабатывать Unicode):
defguard is_alnum(c) when c in ?a..?z or c in ?A..?Z or c in ?0..?9
def parse(string), do: do_parse(string, "", [])
defp do_parse("", "", tokens), do: Enum.reverse(tokens)
defp do_parse("", curr, tokens), do: Enum.reverse([curr | tokens])
defp do_parse(<<c, rest::binary>>, curr, tokens) when is_alnum(c) do
do_parse(rest, curr <> <<c>>, tokens)
end
defp do_parse(<<c, rest::binary>>, "", tokens) do
do_parse(rest, "", [<<c>> | tokens])
end
defp do_parse(<<c, rest::binary>>, curr, tokens) do
do_parse(rest, "", [<<c>>, curr | tokens])
end
Это явно указывает, чтовы ищете и как получить эти данные. Дополнительная особенность заключается в том, что она всегда будет линейной по отношению к длине анализируемой строки.