당신은 예를 들어,
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)
는 솔직히 말해서, 그것은 조금 지저분한 받고 있지만, 여기에 무슨 일이 일어나고 있는지의 것 :
이
당신은 먼저 태그 이름의 길이를 드롭, 다음 중 하나 이상을 오픈 브래킷 및 그런 다음 takeWhile을 사용하여 닫기 대괄호까지 문자를 가져 와서 마무리합니다.
파서를 작성하십시오. 단기간에 다른 해킹을 더 쉽게 할 수는 있지만 나중에 후회할 것입니다. –
그리고 파서의 주제에 관해서는 파섹이 소유하고 있습니다. –
@CatPlusPlus 논쟁의 여지가 있습니다. 성능면에서 Attoparsec은 종종 그것을 앞 당깁니다. –