10

私が欲しいのは、比較的単純だと思います:

> Bin = <<"Hello.world.howdy?">>.
> split(Bin, ".").
[<<"Hello">>, <<"world">>, <<"howdy?">>]

ポインタはありますか?

4

5 に答える 5

20
binary:split(Bin,<<".">>).
于 2012-02-28T08:42:31.470 に答える
10

EEP31 (およびEEP9 )のモジュールバイナリErts-5.8で追加されました(OTP-8217 を参照)。

1> Bin = <<"Hello.world.howdy?">>.
<<"Hello.world.howdy?">>
2> binary:split(Bin, <<".">>, [global]).
[<<"Hello">>,<<"world">>,<<"howdy?">>]
于 2012-02-28T14:07:00.863 に答える
5

R12B で動作するバイナリ分割の約 15% 高速なバージョンがあります。

split2(Bin, Chars) ->
    split2(Chars, Bin, 0, []).

split2(Chars, Bin, Idx, Acc) ->
    case Bin of
        <<This:Idx/binary, Char, Tail/binary>> ->
            case lists:member(Char, Chars) of
                false ->
                    split2(Chars, Bin, Idx+1, Acc);
                true ->
                    split2(Chars, Tail, 0, [This|Acc])
            end;
        <<This:Idx/binary>> ->
            lists:reverse(Acc, [This])
    end.

R11B 以前を使用している場合は、代わりに archaelusバージョンを使用してください。

上記のコードは std の方が高速です。BEAM バイトコードのみ、HiPE ではなく、どちらもほぼ同じです。

編集: R14B 以降、新しいモジュールバイナリによって廃止されたこのコードに注意してください。binary:split(Bin, <<".">>, [global]).代わりに使用してください。

于 2009-01-17T21:30:43.950 に答える
4

lists:split/2バイナリ文字列で機能するのと同等の現在の OTP 関数はありません。EEP-9が公開されるまでは、次のようなバイナリ分割関数を作成できます。

split(Binary, Chars) ->
    split(Binary, Chars, 0, 0, []).

split(Bin, Chars, Idx, LastSplit, Acc)
  when is_integer(Idx), is_integer(LastSplit) ->
    Len = (Idx - LastSplit),
    case Bin of
        <<_:LastSplit/binary,
         This:Len/binary,
         Char,
         _/binary>> ->
            case lists:member(Char, Chars) of
                false ->
                    split(Bin, Chars, Idx+1, LastSplit, Acc);
                true ->
                    split(Bin, Chars, Idx+1, Idx+1, [This | Acc])
            end;
        <<_:LastSplit/binary,
         This:Len/binary>> ->
            lists:reverse([This | Acc]);
        _ ->
            lists:reverse(Acc)
    end.
于 2009-01-09T16:59:22.340 に答える
3

これが1つの方法です:

re:split(<<"Hello.world.howdy?">>, "\\.").
于 2009-01-09T14:52:03.437 に答える