例如,您可以使用简单的递归技巧
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 的长度,然后再删除一个用于左括号的长度,然后使用 takeWhile 将字符提取到右括号。