二进制字符串erlang的第一个字
First word of binary string erlang
我需要做这样的事情 <<"Some text in binary">>,它应该 return <<"Some">。如果没有拆分功能,我怎么能做到这一点,只能通过 Erlang 的模式匹配和 select/if 案例。谢谢。
不确定您为什么不想使用 binary:split。这是实现此目的的 一种 方法,但我不太喜欢它。
first_word_bin(Bin) ->
Len = length_till_space(Bin, 0),
<<Bin:Len/binary>>.
length_till_space(<<>>, Num) -> Num;
length_till_space(<<$\s, _/binary>>, Num) -> Num;
length_till_space(<<_:1/binary, Tl/binary>>, Num) ->
length_till_space(Tl, Num + 1).
但是,如果二进制文件的开头有一个 space,例如
<<" Some text in binary">>
则结果将为 <<>>,如果开头没有 space,则结果将为 <<"Some">>。这可以通过事先修剪起始白色来解决space,但您可以使用相同的方法。
所以我们使用 length_till_space 来获取字符数,直到它达到 space。第一种情况检查二进制文件是否为空,第二种情况检查二进制文件的头部是否为 $\s (space),最后一种情况只是执行尾部调用并递增数字。
然后最后我们只从二进制文件中获取前 X 个字符,return。
虽然Attic's 是正确的,但有一个简单的解决方案(包括前导空格的修剪):
first_word_bin(Bin) ->
first_word_bin(ltrim(Bin), <<>>).
first_word_bin(<<>>, Acc) -> Acc;
first_word_bin(<<$\s, _/binary>>, Acc) -> Acc;
first_word_bin(<<X, Bin/binary>>, Acc) ->
first_word_bin(Bin, <<Acc/binary, X>>).
ltrim(<<$\s, Bin/binary>>) -> ltrim(Bin);
ltrim(Bin) -> Bin.
我需要做这样的事情 <<"Some text in binary">>,它应该 return <<"Some">。如果没有拆分功能,我怎么能做到这一点,只能通过 Erlang 的模式匹配和 select/if 案例。谢谢。
不确定您为什么不想使用 binary:split。这是实现此目的的 一种 方法,但我不太喜欢它。
first_word_bin(Bin) ->
Len = length_till_space(Bin, 0),
<<Bin:Len/binary>>.
length_till_space(<<>>, Num) -> Num;
length_till_space(<<$\s, _/binary>>, Num) -> Num;
length_till_space(<<_:1/binary, Tl/binary>>, Num) ->
length_till_space(Tl, Num + 1).
但是,如果二进制文件的开头有一个 space,例如
<<" Some text in binary">>
则结果将为 <<>>,如果开头没有 space,则结果将为 <<"Some">>。这可以通过事先修剪起始白色来解决space,但您可以使用相同的方法。
所以我们使用 length_till_space 来获取字符数,直到它达到 space。第一种情况检查二进制文件是否为空,第二种情况检查二进制文件的头部是否为 $\s (space),最后一种情况只是执行尾部调用并递增数字。
然后最后我们只从二进制文件中获取前 X 个字符,return。
虽然Attic's
first_word_bin(Bin) ->
first_word_bin(ltrim(Bin), <<>>).
first_word_bin(<<>>, Acc) -> Acc;
first_word_bin(<<$\s, _/binary>>, Acc) -> Acc;
first_word_bin(<<X, Bin/binary>>, Acc) ->
first_word_bin(Bin, <<Acc/binary, X>>).
ltrim(<<$\s, Bin/binary>>) -> ltrim(Bin);
ltrim(Bin) -> Bin.