我在Lazy ByteString上使用Text.Regex.TDFA从文件中提取一些信息。
我必须从这个字符串中提取每个字节:
27 FB D9 59 50 56 6C 8A
这是我尝试过的(我的字符串以空格开头):
(\\ ([0-9A-Fa-f]{2}))+
但我有两个问题:
这是我的最小代码:
import System.IO ()
import Data.ByteString.Lazy.Char8 as L
import Text.Regex.TDFA
main::IO()
main = do
let input = L.pack " 27 FB D9 59 50 56 6C 8A"
let entries = input =~ "(\\ ([0-9A-Fa-f]{2}))+" :: [[L.ByteString]]
print entries
答案 0 :(得分:2)
将乘数附加到捕获组时,引擎仅返回最后一个匹配。有关详细说明,请参阅rexegg.com/regex-capture.html#groupnumbers。
在第一遍中,使用此正则表达式,类似于您已经使用的(使用不区分大小写的选项):
^([\dA-F]+) +([\dA-F]+) +(\d+) +([\dA-F]+)(( [\dA-F]{2})+)
您将获得以下匹配组:
使用第5个作为第二遍的目标,提取每个字节(使用“全局”选项):
([0-9A-Fa-f]{2})
然后每场比赛将单独归还。
注意:您不需要像在原始正则表达式中那样转义空格。