Вопрос

Кажется, я не могу найти достойную документацию по реализации 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*)*

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top