Elixir用正则表达式拆分字符串

时间:2019-10-17 15:07:16

标签: regex elixir

我有以下一行,我需要分割字符串并保留分隔符

>>String.split("hello()", ~r{(?=\W)|(?=\d)(?<=\D)})
>>["hello","(",")"]

在那种情况下,它可以正常工作,但是我需要添加一些更改,但我不知道该怎么做。

它必须拆分字符串:“ -a”“(b”等,并且不拆分它们。所以我需要:

>>["-","a"]

它不必拆分数字为“ hello1”的字符串。我需要:

>>["hello1"]

1 个答案:

答案 0 :(得分:0)

实现此目标的最佳方法是完全不使用正则表达式,因为可以通过模式匹配(如果不需要处理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

这将明确说明您要查找的内容以及如何获取该数据。另一个功能是,它始终与解析的字符串的长度成线性关系。