Я пытаюсь токенизировать строки. Пока нет символов цитирования, все в порядке:
string:tokens ("abc def ghi", " ").
["abc","def","ghi"]
Но string: tokens / 2 очень мне помогает со строками в кавычках. Он ведет себя как ожидалось:
string:tokens ("abc \"def xyz\" ghi", " ").
["abc","\"def","xyz\"","ghi"]
Что мне нужно, так это функция, которая принимает строку для токенизации, разделитель и символ кавычки. Что-то вроде:
tokens ("abc \"def xyz\" ghi", " ", "\"").
["abc","def xyz","ghi"]
Теперь, прежде чем я начну изобретать велосипед, мой вопрос:
Есть ли такая функция или подобная в стандартных библиотеках?
EDIT:
Хорошо, я написал свою собственную реализацию, но я все еще очень заинтересован в ответах на оригинальный вопрос. Вот мой код:
tokens (String) -> tokens (String, [], [] ).
tokens ( [], Tokens, Buffer) ->
lists:map (fun (Token) -> string:strip (Token, both, $") end, Tokens ++ [Buffer] );
tokens ( [Character | String], Tokens, Buffer) ->
case {Character, Buffer} of
{$ , [] } -> tokens (String, Tokens, Buffer);
{$ , [$" | _] } -> tokens (String, Tokens, Buffer ++ [Character] );
{$ , _} -> tokens (String, Tokens ++ [Buffer], [] );
{$", [] } -> tokens (String, Tokens, "\"" );
{$", [$" | _] } -> tokens (String, Tokens ++ [Buffer ++ "\""], [] );
{$", _} -> tokens (String, Tokens ++ [Buffer], "\"");
_ -> tokens (String, Tokens, Buffer ++ [Character] )
end.