Haskell Posix에서 멀티 린 매칭
-
06-07-2019 - |
문제
Haskell의 Posix 구현에 대한 괜찮은 문서를 찾을 수없는 것 같습니다. 특히 모듈 Text.Regex.Posix
.
누구든지 문자열에서 멀티 라인 매칭을 사용하는 올바른 방향으로 나를 가리킬 수 있습니까?
호기심을위한 스 니펫 :
> extractToken body = body =~ "<textarea[^>]*id=\"wpTextbox1\"[^>]*>(.*)</textarea>" :: String
Wikipedia 페이지의 출처를 추출하려고하지만이 방법은 하나 이상의 줄이 관련 될 때 분명히 넘어갑니다.
해결책
필요할 수 있습니다 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>"
다른 팁
Posix Regexes보다 유연하거나 성능이 향상 된 경우 PCRE 백엔드를 대신 사용해야 할 수도 있습니다.
PCRE-Light와 Regex-PCRE는 모두 괜찮습니다.
나는이 경우 일치하여 해결했다
((.*)|\n*)*
이것은 당신의 표현에 따라 항상 작동하지는 않지만. 위의 솔루션은 아마도 가능하다면 가장 좋은 방법 일 것입니다.
제휴하지 않습니다 StackOverflow