2015-04-24 9 views
3

Я использую Text.Regex.TDFA в Lazy ByteString для извлечения некоторой информации из файла.Haskell Regex non capture group

Я должен извлечь каждый байт из этой строки:

27 FB D9 59 50 56 6C 8A 

Вот что я попытался (моя строка начинается с места):

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

, но у меня есть 2 проблемы:

  • только последний матч возвращается [[ "27 FB D9 59 50 56 6C 8А", "8A", "8A"]]
  • Я хочу, чтобы сделать внешнюю группу не caputing один (например: в других двигателях)

Вот мой минимальный код:

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

1-й реш. спасибо Брайан Стивенс: D –

ответ

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})

Тогда каждый матч будет возвращен отдельно.

Примечание: Вам не нужно избегать пробелов, как в исходном регулярном выражении.

+0

Мне нужно захватить из этого «6000 60B 109743043 0008 27 FB D9 59 50 56 6C 8A», и мое полное регулярное выражение «^ ([0-9A-Fa-f] +) \\ + ([ 0-9A-Fa-f] +) \\ + ([0-9] +) \\ + ([0-9A-Fa-f] +) (\\ ([0-9A-Fa-f] { 2}))». Я могу использовать обходное решение для захвата последней части, а затем сделать другое регулярное выражение для извлечения байтов, но хочу знать, возможно ли это, а не обходное решение –

+0

@GabrielCiubotaru. Вы можете использовать свое полное регулярное выражение для первого прохода: '^ ([\ dA-F] +) + ([\ dA-F] +) + (\ d +) + ([\ dA-F] +) (([\ dA-F] {2}) +) ', тогда используйте регулярное выражение, которое я дал в своем ответе, чтобы разбить «27 FB D9 59 50 56 6C 8A», который был записан в последней группе. Если это решает вашу проблему, не забудьте отметить ее как «принятый ответ». Благодаря! –

+0

Это решает мою первую проблему, но все же, как я могу сделать негласную группировку в haskell? И btw, \ d не работает в haskell. –