使用RegEx在Erlang中按字符数拆分二进制文件

时间:2014-08-29 14:32:32

标签: regex binary erlang

我正在尝试将二进制文件拆分为80个字符的卡盘。

Li= <<"Lorem ipsum dolor sit amet, consectetur adipiscing elit.
    Maecenas vitae ligula urna.     Etiam id pulvinar arcu. Ut
    maximus eros sed ligula blandit aliquet. Vivamus arcu urna,
    efficitur cursus dapibus nec, cursus sit amet elit. Aliquam
    tortor magna, aliquet vulputate nulla sit amet, efficitur cras amet.">>.

我尝试过re:split(Li,&#34;(。{80})&#34;)给了我。

[<<>>,                                                                                                                                            
<<"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vitae ligula u">>,
<<>>,
 <<"rna. Etiam id pulvinar arcu. Ut maximus eros sed ligula blandit aliquet. Vivamus">>,
<<>>,
 <<" arcu urna, efficitur cursus dapibus nec, cursus sit amet elit. Aliquam tortor m">>,
<<"agna, aliquet vulputate nulla sit amet, efficitur cras amet.">>]

如何清除列表中的空白部分以及为什么要删除它们?

3 个答案:

答案 0 :(得分:2)

你得到的是空的部分,因为它们是你的标记之间匹配的部分。 re:split(如string:tokens)查找匹配部分的周围的数据,而不是匹配的部分本身。你收到八十个字符块的唯一原因是因为你的正则表达式中有一个组。

据我所知,没有办法删除结果的空白部分(没有明确过滤),因为这些是re:split 期望返回的部分。

您可以获得所需结果的一种方法是使用标准正则表达式(而不是拆分):

re:run("abcdefg", ".{2}", [global, {capture, all, binary}]) = {match,[[<<"ab">>],[<<"cd">>],[<<"ef">>]]}.

如您所见,我们只是匹配我们可以在字符串中找到的所有双字符组。

话虽如此,正则表达式并不是理想的解决方案;至少可以说,他们是矫枉过正的。编写一个从二进制文件中提取八十个字符块(或多个剩余部分)的函数应该相对简单。例如:

make_chunks(<<C:80/binary>>, Rest/binary>>) ->
    [C|make_chunks(Rest)];
make_chunks(<<>>) ->
    [];
make_chunks(<<Rest/binary>>) ->
    [Rest].

这也有效,不需要复杂的评估或正则表达式的编译。如果您打算处理Unicode,也可以使用“utf8”类型(<<C:80/utf8>>)。

答案 1 :(得分:1)

我不知道erlang,但是在许多语言中,当你使用捕获组拆分正则表达式时,就像你一样,将组放入结果中。

所以,你想分开80个字符并保留分隔符。

结果是:

  • 第一个元素:'':这是第一个分隔符之前的内容(即:前80个字符之前)
  • 第二个元素:Lorem ipsum ... ligula u:这是第一个分隔符(即:80个字符)
  • 第三个元素:'':这是第一个和第二个分隔符之间的内容。
  • 等......

答案 2 :(得分:0)

你可以做到

re:run(B, <<".{80}">>,[{capture,first,binary},global]).

但它确实返回了二进制文件列表的列表。