LINUX.ORG.RU

[HaskelЪ] Как разбить строку?


0

0

Есть строка "qw%q2&&d43+cv43" нужно получить ["qw", "%", "q2", "&&", "d43", "+", "cv43"].

Смотрел в начале на splitRegex, но функция выкидывает разделители. Хотелось бы что-то типа splitRegexWithMatches. Короче, как сделать?

anonymous

Prelude Data.List> groupBy (\x y -> not $ (y `elem` "%&+") /= (x `elem` "%&+")) "qw%q2&&d43"
["qw","%","q2","&&","d43"]

pierre
()

> Есть строка "qw%q2&&d43+cv43" нужно получить ["qw", "%", "q2", "&&", "d43", "+", "cv43"].

И по какому принципу ты собираешься ее разбивать? Я вот закономерности вообще не вижу.

anonymous
()
Ответ на: комментарий от anonymous

> И по какому принципу ты собираешься ее разбивать? Я вот закономерности вообще не вижу.

кажется, по лексемам.

топикстартеру смотреть функцию lex

Joe_Bishop
()

А вобще если там всякие разные разделители, может быть уже пора брать parsec.

pierre
()
Ответ на: комментарий от anonymous

> И по какому принципу ты собираешься ее разбивать? Я вот закономерности вообще не вижу.

Есть набор разделителей % && + и д.р. выходной список - это список самих разделителей и фрагментов исходной стоки, которые между ними находятся, в порядке их следования в исходной строке.

anonymous
()
Ответ на: комментарий от anonymous

А мой код что, не прокатил? :-) lex читает хаскельные лексемы, не уверен что подойдет для таких извратных разделителей

pierre
()
Ответ на: комментарий от pierre

> Из всего что я знаю это самый элегантный split

Мда... Я ж таким все начальство распугаю! :)

А, что там про parsec?

anonymous
()

Не такой красивый как выше, но тоже вариант:

split :: String -> String -> [String]
split _ [] = []
split d s = w : w' : split d s''
    where
        (w, s') = break (`elem` d) s
        (w', s'') = break (`notElem` d) s'

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.