Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 二进制模式匹配-我可以从“中提取数字吗?”/单词/数字/单词/数字“;_Erlang_Elixir - Fatal编程技术网

Erlang 二进制模式匹配-我可以从“中提取数字吗?”/单词/数字/单词/数字“;

Erlang 二进制模式匹配-我可以从“中提取数字吗?”/单词/数字/单词/数字“;,erlang,elixir,Erlang,Elixir,我知道如何使用常规的字符串操作来实现这一点,但我很好奇是否可以在一个步骤中匹配 假设我有accounts/123123/order/234234。它来自外部来源,因此虽然我知道账户/和/order总是固定长度/值,但数字可能并不总是固定长度。这里有没有办法进行二进制模式匹配?或者比一些字符串操作更好的东西 如果可以一步匹配 只有当我们知道所有剩余零件的尺寸时,我们才能进行模式匹配。据我所知,这不能作为一个模式匹配来完成 还有比一些字符串操作更好的吗 一个字符串操作怎么样 iex>tag=“acc

我知道如何使用常规的字符串操作来实现这一点,但我很好奇是否可以在一个步骤中匹配

假设我有
accounts/123123/order/234234
。它来自外部来源,因此虽然我知道
账户/
/order
总是固定长度/值,但数字可能并不总是固定长度。这里有没有办法进行二进制模式匹配?或者比一些字符串操作更好的东西

如果可以一步匹配

只有当我们知道所有剩余零件的尺寸时,我们才能进行模式匹配。据我所知,这不能作为一个模式匹配来完成

还有比一些字符串操作更好的吗

一个字符串操作怎么样

iex>tag=“accounts/123123/order/234234”
iex>[“帐户”,帐户,“订单”,订单]=String.split(标记“/”)
iex>帐户
"123123"
iex>订单
"234234234"
Regex也是一个不错的选择

iex>tag=“accounts/123123/order/234234”
iex>regex=~R{^accounts/(?\d+)/order/(?\d+)$}
iex>Regex.named_捕获(Regex,标记)
%{“账户”=>“123123”,“订单”=>“234234”}
其他选项

在erlang中:

~$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> binary:split(<<"accounts/123123/order/234234234">>, <<"/">>, [global]). 
[<<"accounts">>,<<"123123">>,<<"order">>,<<"234234234">>]
使用elixir regexes:

iex(3)> Regex.scan( ~r{[^/]+}, "accounts/123123/order/234234234") |> List.flatten() 
["accounts", "123123", "order", "234234234"]

有一点元编程是不行的:)

defmodule AccOrd do
@输入“accounts/123123/order/234234”

对于acc如果您正在寻找易于阅读的内容,您可以将二进制文件转换为列表,并使用io_lib:format/2函数:

1> Tag = <<"accounts/123123/order/234234234">>.
<<"accounts/123123/order/234234234">>
2> {ok,[ACC,ORD],_} = io_lib:fread("accounts/~d/order/~d",binary_to_list(Tag)).
{ok,[123123,234234234],[]}
3>
1>标记=。
2> {ok,[ACC,ORD],{}=io_lib:fread(“accounts/~d/order/~d”,二进制列表(Tag))。
{好的,[123234234],]}
3>

旁注:与我成功地从gps位置进行模式匹配的方法非常相似,gps位置由G返回,作为花式字符串(
“41°23'15.59868˝N”
),如果我们确定订单id的长度不超过某个有限数,我们当然可以;看看我的答案。
1> Tag = <<"accounts/123123/order/234234234">>.
<<"accounts/123123/order/234234234">>
2> {ok,[ACC,ORD],_} = io_lib:fread("accounts/~d/order/~d",binary_to_list(Tag)).
{ok,[123123,234234234],[]}
3>