Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
1

Чтение файла, регулярные выражения

22.01.2019, 15:59. Показов 2275. Ответов 11

Author24 — интернет-сервис помощи студентам
Приветствую всех. Как можно открыть текстовый файл, применить к содержимому эти регулярные выражения
Haskell
1
2
3
4
$alpha = [a-zA-Z]
$digit = [0-9]
$hex = [0-9a-fA-F]
$bin = [0-1]
и вывести результат?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2019, 15:59
Ответы с готовыми решениями:

Регулярные выражения и проверка строки на цифру (Elixir)
Я решаю задачу и не могу понять как написать регулярное выражение условие: ...

Функция-анализатор, которая распознает регулярные выражения
Помогите пожалуйста написать функцию-анализатор reg, которая распознает регулярное выражение, -...

Чтение файла в потоке и регулярные выражения
Доброго времени! Дали задание написать небольшой парсер из файла. Файл не текстовый, а результат...

Запись/Чтение файла, массив строк, регулярные выражения
Привет ребята, столкнулся с такой задачей. Записываю данные в файл с помощью textBox и...

11
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,643
Записей в блоге: 13
22.01.2019, 16:06 2
Вот статья, правда на английском.
1
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
22.01.2019, 16:14  [ТС] 3
Catstail, мало что понятно.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,643
Записей в блоге: 13
22.01.2019, 16:32 4
Вот примерно так:

Haskell
1
2
3
4
5
6
7
8
9
10
import Text.Regex.Posix
 
sten1 :: String -> String -> Bool
sten1 test patt = test =~ patt
 
sten2 :: String -> String -> String
sten2 test patt = test =~ patt
 
sten3 :: String -> String -> (String,String,String)
sten3 test patt = test =~ patt
А теперь в консоли:

Haskell
1
2
3
4
5
6
7
8
9
10
11
*Main> sten1 "foodiebar, fooquuxbar" "(foo[a-z]*bar|quux)"
True
it :: Bool
 
*Main> sten2 "foodiebar, fooquuxbar" "(foo[a-z]*bar|quux)"
"foodiebar"
it :: String
 
*Main> sten3 "foodiebar, fooquuxbar" "(foo[a-z]*bar|quux)"
("","foodiebar",", fooquuxbar")
it :: (String, String, String)
1
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
22.01.2019, 17:18  [ТС] 5
Catstail, при компиляции выдает ошибку:
cd.hs:1:1: error:
Could not find module ‘Text.Regex.Posix’
Use -v to see a list of the files searched for.
|
1 | import Text.Regex.Posix | ^^^^^^^^^^^^^^^^^^^^^^^
Нужно подключать какие-то дополнительные библиотеки?
"А теперь в консоли:", вот тут я уже окончательно запутался.
Раньше не имел таких серьезных дел с хаскелем, литературы годной, которая это все объясняет на пальцах найти не могу.
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
22.01.2019, 17:51 6
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
Нужно подключать какие-то дополнительные библиотеки?
Да, нужно подключить пакет regex-posix.
А вот как это сделать зависит от того, какой компилятор (или не компилятор) Haskell вы используете. И на какой ОС.
Обычно, лучше создать проект, пусть и с одним исходным файлом, и в конфигурации проекта прописать этот пакет, который загрузится при первой сборке.
Вот тут https://www.ohaskell.guide/setup.html
правда описывается установка утилиты stack для macOS, но там есть ссылка на установку stack-a в разных ОС.
https://haskell-lang.org/get-started

В общем, когда создадите проект, там будет файл ИмяПроекта.cabal и внутри после строки с build-depends: добавить строку
сохраняя отступ, например
Haskell
1
2
  build-depends:       base >= 4.7 && < 5
                      ,regex-posix
1
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
22.01.2019, 17:54  [ТС] 7
Curry, спасибо, сейчас буду разбираться. А что касается кода из ответа выше, он разделен на две части. Я не совсем понимаю для чего. Можете объяснить?
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
22.01.2019, 18:07 8
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
А что касается кода из ответа выше, он разделен на две части. Я не совсем понимаю для чего.
Первая часть в файле .hs, вторая ввод команд в интерпретатор (https://ru.wikipedia.org/wiki/REPL) c его сообщениями. Первая часть, предварительно загружена в интерпретатор.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,643
Записей в блоге: 13
22.01.2019, 18:10 9
Вот небольшой пример, в котором читается файл (имя задается в командной строке первым параметром) и печатаются все строки, которые удовлетворяют шаблону (задаваемому в командной строке вторым параметром):

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import System.IO
import System.Environment
import Text.Regex.Posix
 
sten1 :: String -> String -> Bool
sten1 test patt = test =~ patt
 
--sten2 :: String -> String -> String
--sten2 test patt = test =~ patt
 
--sten3 :: String -> String -> (String,String,String)
--sten3 test patt = test =~ patt
 
main = do
       (fnam:patt:etc) <- getArgs
       handle <- openFile fnam ReadMode
       contf <- hGetContents handle
       mapM putStrLn (filter (\ t -> (sten1 t patt)) (lines contf)) 
       hClose handle
1
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
22.01.2019, 20:00 10
проще
Haskell
1
2
3
4
main = do
       (fnam:patt:_) <- getArgs
       contf <- readFile fnam
       mapM putStrLn (filter (\ t -> (sten1 t patt)) (lines contf))
1
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
22.01.2019, 20:31  [ТС] 11
Curry, а как быть с регулярными выражениями? Где они задаются?
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
22.01.2019, 21:42 12
Encrypted1010, я привёл только изменённую функцию main. Всё что выше неё подразумевается то же что у Catstail.

Добавлено через 8 минут
При выполнении программы первый аргумент - имя читаемого файла, второй - само регулярное выражение. Вот
Haskell
1
       (fnam:patt:_) <- getArgs
в этой строчке указано разобрать аргументы командной строки. первый - fname, второй - patt, остальные аргументы, если есть, игнорируем.
Если не хотите вводить из командной строки, то можете прямо в коде программы (вместо вышеприведённой строки)
Haskell
1
2
       let fnam = "inputfile.txt"
           patt = "(foo[a-z]*bar|quux)"
1
22.01.2019, 21:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2019, 21:42
Помогаю со студенческими работами здесь

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?
Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех реальных ссылок на...

Регулярные выражения sql (путь файла)
Всем доброго времени суток! Требуется с помощью регулярных выражений (или, если есть другой...

Регулярные выражения: извлечение из файла номеров телефонов
Реализовать программу, извлекающую из файла номера телефонов. Требования: 1. исходный текст, из...

Регулярные выражения. Вытащить Имена и фамилии из текстового файла
Вытащить из текста с помощью регулярных выражений имена и фамилии.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru