Многострочное сопоставление в Haskell Posix
-
06-07-2019 - |
Вопрос
Кажется, я не могу найти достойную документацию по реализации POSIX на haskell.
В частности, модуль Text.Regex.Posix
.
Может ли кто-нибудь указать мне правильное направление использования многострочного сопоставления для строки?
Фрагмент для любопытных:
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
Я пытаюсь извлечь источник страниц википедии, однако этот метод явно не подходит, когда задействовано более одной строки. Р>
Решение
Вам может потребоваться импортировать Text.Regex.Base.RegexLike
для доступа к makeRegexOpts
и друзьям.
extractToken body = match regex body where
regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Ну, поскольку Text.Regex.Posix
defaultCompOpt = compExtended + compNewline
, это эквивалентно работает как
extractToken body = match regex body where
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Чтобы вывести только первую группу, используйте один из других экземпляров RegexLike
. Одна из возможностей
extractToken body = head groups where
(preMatch, inMatch, postMatch, groups) =
match regex body :: (String, String, String, [String])
regex = makeRegexOpts compExtended defaultExecOpt
"<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>"
Другие советы
Возможно, вам придется использовать бэкэнд PCRE, если вы хотите сделать что-то более гибкое или с лучшей производительностью, чем регулярные выражения Posix.
pcre-light и regex-pcre в порядке.
Я решил в этом случае, сопоставив
((.*)|\n*)*
Хотя это может не всегда работать в зависимости от вашего выражения. Приведенное выше решение, вероятно, является лучшим способом, если вы можете. Р>