Erlang 带相邻分离器的分离管柱

Erlang 带相邻分离器的分离管柱,erlang,Erlang,我想用相邻的分隔符分割字符串(如果您还记得string:tokens忽略相邻分隔符) 所以我现在有这个: split(L, C) -> lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]). split([], _, Acc) -> Acc; split([C|T], C, Acc) -> split(T, C, [[]|Acc]); split([H|T], C, [AH|AT]) -> spli

我想用相邻的分隔符分割字符串(如果您还记得
string:tokens
忽略相邻分隔符)

所以我现在有这个:

split(L, C) -> lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]).

split([], _, Acc) -> Acc;
split([C|T], C, Acc) -> split(T, C, [[]|Acc]);
split([H|T], C, [AH|AT]) -> split(T, C, [[H|AH]|AT]).
split(L,C)->列表:反向([list:reverse(X)| | X Acc;
拆分([C | T],C,Acc)->拆分(T,C,[[]Acc]);
拆分([H | T],C[AH | AT])->拆分(T,C,[H | AH]| AT])。
对于输入
tut6:split(“12432524,32453,4”,“,”),返回值恰好是
[“12432524,32453,4”]
。我不明白问题是什么。 有人能给我指一下吗

所需的输出是
[“12432524”,“32453”,“4”]


提前感谢您的帮助。

问题是您正在将要拆分的字符串的每个字符与整个字符串分隔符进行比较。当您调用

tut6:split("12432524,,32453,4", ",").
然后,在模块内第一次调用
split/3

split([$1|"2432524,,32453,4"], ",", [[]]) ...
第一个参数的开头是字符
1
,但您将其与字符串
“,”
”进行比较,当然,这将永远不会匹配,因此您的输入字符串永远不会被拆分

有几种方法可以解决此问题:

  • 让调用方传递字符分隔符而不是字符串,如下所示:

    tut6:split(2432524,,32453,4", $,).
    
  • 让调用者传递一个字符串分隔符,但只使用其第一个字符作为实际分隔符。您可以通过将代码中的
    split(L,C)
    更改为

    split(L,[C]) ->
        lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]).
    

    但是,这段代码并不完全正确,因为它适用于像“
    ”、“
    这样的简单分隔符,但除非在分隔符字符串中引用所有正则表达式元字符,否则通常不起作用。

    问题是,您正在将要拆分的字符串的每个字符与整个字符串分隔符进行比较。当您调用

    tut6:split("12432524,,32453,4", ",").
    
    然后,在模块内第一次调用
    split/3

    split([$1|"2432524,,32453,4"], ",", [[]]) ...
    
    第一个参数的开头是字符
    1
    ,但您将其与字符串
    “,”
    ”进行比较,当然,这将永远不会匹配,因此您的输入字符串永远不会被拆分

    有几种方法可以解决此问题:

    • 让调用方传递字符分隔符而不是字符串,如下所示:

      tut6:split(2432524,,32453,4", $,).
      
    • 让调用者传递一个字符串分隔符,但只使用其第一个字符作为实际分隔符。您可以通过将代码中的
      split(L,C)
      更改为

      split(L,[C]) ->
          lists:reverse([lists:reverse(X) || X <- split(L, C, [[]])]).
      
      但是,这段代码并不完全正确,因为它适用于一个简单的分隔符,如“
      ”,“
      ”,但除非您在分隔符字符串中引用所有正则表达式元字符,否则它一般不起作用。

      您可以通过以下方法轻松做到这一点:try
      re:split(“12432524,32453,4”,“,”,[{return list}])在shell中,您将看到它返回您想要的结果:
      [“12432524”、[]、“32453”、“4”]
      。您可以轻松地使用:try
      re:split(“12432524、32453、4”、“,[{return、list}])。
      在shell中,您将看到它返回您想要的结果:
      [“12432524”、[]、[]、“32453”、“4”