2009-06-22 4 views
4

Я не могу найти достойную документацию по реализации POSIX от haskell. В частности, модуль Text.Regex.Posix.Многострочное совпадение в Haskell Posix

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

Отрывок для любознательных:

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

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

ответ

7

Возможно, вам понадобится import Text.Regex.Base.RegexLike для доступа к makeRegexOpts и друзьям.

extractToken body = match regex body where 
    regex = makeRegexOpts (defaultCompOpt - compNewline) defaultExecOpt 
       "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" 

Ну, так как Text.Regex.Posix «s 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>" 
+0

Отлично работает, спасибо. Кроме того, есть ли способ вернуть только совпадение (. *), Или это только в PCRE? –

2

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

pcre-light и regex-pcre оба хороши.

+0

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

0

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

((.*)|\n*)* 

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