سؤال

وأنا لا يمكن أن يبدو للعثور على وثائق لائق على تنفيذ POSIX هاسكل ل. على وجه التحديد Text.Regex.Posix حدة.

ويمكن لأي شخص لي نقطة في الاتجاه الصحيح لاستخدام مطابقة متعدد الأسطر على سلسلة؟

وقصاصة لالغريب:

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

وأحاول استخراج مصدر صفحات ويكيبيديا، ولكن هذا الأسلوب يندرج بوضوح أكثر عندما يتعلق الأمر أكثر من سطر واحد.

هل كانت مفيدة؟

المحلول

وقد تحتاج إلى 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>"

لسحب فقط المجموعة الأولى، استخدم إحدى حالات أخرى من <لأ href = "http://www.haskell.org/ghc/docs/latest/html/libraries/regex-base/Text-Regex -Base-RegexLike.html # ر٪ 3ARegexLike "يختلط =" noreferrer "> 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 بدلا من ذلك إذا كنت تريد أن تفعل أي شيء أكثر مرونة، أو مع أداء أفضل، من regexes POSIX.

وPCRE الضوء والتعابير المنطقية-PCRE كلاهما غرامة.

وأنا حلها في هذه الحالة عن طريق مطابقة

((.*)|\n*)*

وعلى الرغم من أن هذا قد لا تعمل دائما حسب تعبير الخاص بك. الحل أعلاه هو على الارجح أفضل وسيلة للذهاب إذا كنت قادرة على.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top