Haskell Regex非捕获组

时间:2015-04-24 13:36:52

标签: regex haskell

我在Lazy ByteString上使用Text.Regex.TDFA从文件中提取一些信息。

我必须从这个字符串中提取每个字节:

 27 FB D9 59 50 56 6C 8A

这是我尝试过的(我的字符串以空格开头):

(\\ ([0-9A-Fa-f]{2}))+

但我有两个问题:

  • 仅返回最后一场比赛[[“27 FB D9 59 50 56 6C 8A”,“8A”,“8A”]]
  • 我想让外部组别不受限制(比如?:在其他引擎中)

这是我的最小代码:

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

1 个答案:

答案 0 :(得分:2)

将乘数附加到捕获组时,引擎仅返回最后一个匹配。有关详细说明,请参阅rexegg.com/regex-capture.html#groupnumbers

在第一遍中,使用此正则表达式,类似于您已经使用的(使用不区分大小写的选项):

^([\dA-F]+) +([\dA-F]+) +(\d+) +([\dA-F]+)(( [\dA-F]{2})+)

您将获得以下匹配组:

enter image description here

使用第5个作为第二遍的目标,提取每个字节(使用“全局”选项):

([0-9A-Fa-f]{2})

然后每场比赛将单独归还。

注意:您不需要像在原始正则表达式中那样转义空格。