たとえば、単純な再帰トリックを使用できます
findTag [] = -- end of list code.
findTag ('@':xs)
| take 5 xs == "title" = -- your code for @title
| otherwise = findTag xs
findTag (_:xs) = findTag xs
したがって、基本的には、次の文字 (リストの先頭) が「@」の場合にパターン マッチを行い、次の 5 文字が「タイトル」を形成するかどうかを確認します。その場合は、解析コードを続行できます。次の文字が「@」でない場合は、再帰を続行します。リストが空になると、最初のパターン マッチに到達します。
他の誰かがより良い解決策を持っているかもしれません。
これがあなたの質問に答えることを願っています。
編集:
もう少し柔軟性を持たせるために、特定のタグを見つけたい場合は、次のようにすることができます。
findTag [] _ = -- end of list code.
findTag ('@':xs) tagName
| take (length tagName) xs == tagName = -- your code for @title
| otherwise = findTag xs
findTag (_:xs) _ = findTag xs
こうすれば
findTag text "title"
特にタイトルを探します。タグ名はいつでも好きな名前に変更できます。
別の編集:
findTag [] _ = -- end of list code.
findTag ('@':xs) tagName
| take tLength xs == tagName = getTagContents tLength xs
| otherwise = findTag xs
where tLength = length tagName
findTag (_:xs) _ = findTag xs
getTagContents :: Int -> String -> String
getTagContents len = takeWhile (/=')') . drop (len + 1)
正直に言うと、少し面倒ですが、ここで何が起こっているかを示します。
最初に tagName の長さを削除し、次に開始ブラケットの長さを 1 つ削除します。次に、takeWhile を使用して終了ブラケットまでの文字を取得して終了します。