Многострочное сопоставление в Haskell Posix - PullRequest
4 голосов
/ 22 июня 2009

Кажется, я не могу найти достойную документацию по реализации POSIX на haskell. Конкретно модуль Text.Regex.Posix.

Может ли кто-нибудь указать мне правильное направление использования многострочного сопоставления для строки?

Фрагмент для любопытных:

> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String

Я пытаюсь извлечь источник страниц википедии, однако этот метод явно падает, когда задействовано более одной строки.

Ответы [ 3 ]

7 голосов
/ 23 июня 2009

Вам может понадобиться import 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>"
2 голосов
/ 22 июня 2009

Возможно, вам придется использовать бэкэнд PCRE, если вы хотите сделать что-то более гибкое или с лучшей производительностью, чем регулярные выражения Posix.

pcre-light и regex-pcre в порядке.

0 голосов
/ 22 июня 2009

Я решил в этом случае, сопоставив

((.*)|\n*)*

Хотя это может не всегда работать в зависимости от вашего выражения. Приведенное выше решение, вероятно, является лучшим способом, если вы можете.

...