[erlang-questions] splitting string into to substring

Richard A. O'Keefe <>
Thu Sep 11 06:22:59 CEST 2008


On 11 Sep 2008, at 10:19 am, Yunita C wrote:
> I am new to erlang and I want to write Erlang function that given a  
> string and a pattern and uses the pattern to split the string into  
> like this:

If the pattern is <x> then <a><x><b><x><c> turns into [<a>,<b>,<c>].

If only we had a function that would take <a><x><other stuff> and
give us {<a>,<other stuff>} or <a> (with no <x>) and give us {<a>}
we could write

split(List, Separator) ->
     case first_substring(List, Separator)
       of {First,Rest} -> [First | split(Rest, Separator)]
        ; {Only}       -> [Only]
     end.

Already we can see that split("", Sep) = [""] for any Sep.

If only we had a function that would tell us if one list was a
prefix of another, we could write the missing function:

first_substring(List, Separator) ->
     first_substring_loop(List, Separator, []).

first_substring_loop([], _, Reversed_First) ->
     {lists:reverse(Reversed_First)};
first_substring_loop(List = [Head|Tail], Separator, Reversed_First) ->
     case prefix_check(Separator, List)
       of no -> first_substring_loop(Tail, Separator, [Head| 
Reversed_First])
        ; Suffix -> {lists:reverse(Reversed_First), Suffix}
     end.

Writing prefix_check/2 isn't going to be hard.

prefix_check([], List) ->
     List;
prefix_check([Head|Prefix], [Head|List]) ->
     prefix_check(Prefix, List);
prefix_check(_, _) ->
     no.

I would have mentioned regexp:split/2, except that it gets
the separator " " (one space) wrong.  So I shan't.




More information about the erlang-questions mailing list