]>
<< DjangoでRSSリーダーを作る(4) カスタムタグ内で別の変数を参照したいとき | main | FedoraにBerylをインストールmemo >>
Lv3
アルファベットのみからなる文字列中から、大文字ちょうど三つにはさまれた小文字を抜き出す
ex. "aPQRbVWXcYZABd" -> "b"
import Text.ParserCombinators.Parsec
bodyguards :: Parser String
bodyguards = try ( do { upper; upper; upper ; c <- lower
; upper; upper; upper; many1 lower; return [c] })
<|> do { skipMany1 upper ; skipMany1 lower ; return ""}
bg :: Parser String
bg = do { many lower ; r <- many1 (try bodyguards)
; many upper ; eof ; return $ concat r }
readBdGrs :: String -> String
readBdGrs input = case parse bg "" input of
Left err -> "No match: " ++ show err
Right val -> show val
main :: IO()
main = do x <- getContents
putStrLn $ readBdGrs $ filter (/= '\n') x
Haskellに正規表現は似合わない、と思ったものの、いまいちParsecが使いこなせなくて困る。skipManyやconcatのあたりとか、もうちょっと恰好よくできないものか。
http://www.panopticon.jp/mt/mt-tb.cgi/74
コメントする