Erlang二进制模式匹配失败

jsh*_*jlo 2 binary erlang pattern-matching binaries

为什么会出现badmatch错误?我无法弄清楚为什么会失败:

<<IpAddr, ":*:*">> = <<"2a01:e34:ee8b:c080:a542:ffaf:*:*">>.
Run Code Online (Sandbox Code Playgroud)

jur*_*uro 6

您需要指定大小,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">>
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下不会发生这种情况,对吧?如果是这样,也可以从变量中读取字节数:`IpAddr:IpLength/binary`. (2认同)

rvi*_*ing 5

二进制的模式匹配从左到右进行,因此IpAddr在尝试下一个段之前它将首先匹配.在匹配之前没有回溯.默认类型变量,如IpAddr匹配一个字节.有关正确的说明和更多示例,请参见位语法表达式位语法.

作为使用模式匹配的替代方法,您可以考虑使用该binary模块.有两个功能可能对您有用:binary:match/2/3binary:split/2/3.这些搜索可能更适合您的问题.

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