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>