Binary Erlang二进制模式匹配失败

Binary Erlang二进制模式匹配失败,binary,erlang,pattern-matching,binaries,Binary,Erlang,Pattern Matching,Binaries,为什么此问题会导致不匹配错误?我不明白为什么会失败: <<IpAddr, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>. =。 您需要指定IpAddr的大小,以便模式匹配: 1> <<IpAddr:28/binary, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>. <<"2

为什么此问题会导致不匹配错误?我不明白为什么会失败:

<<IpAddr, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.
=。

您需要指定
IpAddr
的大小,以便模式匹配:

1> <<IpAddr:28/binary, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.
<<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>
2> IpAddr.
<<"2a01:e34:ee8b:c080:a542:ffaf">>
1>=。
2> IpAddr。

二进制文件的模式匹配从左到右进行,因此在尝试下一段之前,它将首先匹配
IpAddr
。在比赛之前没有回溯。像
IpAddr
这样的默认类型变量匹配一个字节。有关正确的说明和更多示例,请参见和

作为使用模式匹配的替代方法,您可以考虑使用<代码>二进制< /代码>模块。有两个函数可能对您有用:

binary:match/2/3
binary:split/2/3
。这些搜索可能更适合您的问题


作为最后一种选择,您可以尝试使用正则表达式和
re
模块。

如果大小是可变的,该怎么办?在这种情况下不会发生这种情况,对吗?如果是这样,也可以从变量中读取字节数:
IpAddr:IpLength/binary
。不幸的是,在这种情况下,它可以读取,因为每个段中的字符数可能会有所不同。@DiegoSevilla我认为erlang无法做到这一点。如果IpLength未绑定,则会出现错误。