我有以下一行,我需要分割字符串并保留分隔符
>>String.split("hello()", ~r{(?=\W)|(?=\d)(?<=\D)})
>>["hello","(",")"]
在那种情况下,它可以正常工作,但是我需要添加一些更改,但我不知道该怎么做。
它必须拆分字符串:“ -a”“(b”等,并且不拆分它们。所以我需要:
>>["-","a"]
它不必拆分数字为“ hello1”的字符串。我需要:
>>["hello1"]
答案 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
这将明确说明您要查找的内容以及如何获取该数据。另一个功能是,它始终与解析的字符串的长度成线性关系。