Erlang解析占位符变量

Erlang解析占位符变量,erlang,Erlang,我试图创建一种特殊的模板格式,它必须定位{{{--example_id--}}}}的出现,并单独替换该内容,然后通过括号中的值获取它 我最初的尝试是拆分,下面我发布了一些示例代码,这些代码尚未针对多个占位符进行优化,一次只能处理一个占位符 parse_text() -> Text = <<"this is text {{{--test_placeholder_1--}}} and this also">>, % would not work here

我试图创建一种特殊的模板格式,它必须定位
{{{--example_id--}}}}
的出现,并单独替换该内容,然后通过括号中的值获取它

我最初的尝试是拆分,下面我发布了一些示例代码,这些代码尚未针对多个占位符进行优化,一次只能处理一个占位符

parse_text() ->
    Text = <<"this is text {{{--test_placeholder_1--}}} and this also">>,
    % would not work here:
    % Text = <<"this is text {{{--test_placeholder_1--}}} and this {{{--test_placeholder_2--}}} also">>,
    [_,Tail] = binary:split(Text, [<<"{{{--">>],[global]),
    [Id|_] = binary:split(Tail, [<<"--}}}">>],[global]),

    Pattern = <<"{{{--", Id/binary, "--}}}">>,
    Replacement = get_content(Id),
    Result = binary:replace(Text, Pattern, Replacement),

    io:fwrite("~p\n", [Result]).


get_content(<<"test_placeholder_1">>)->
    <<"test id 1!">>;
get_content(<<"test_placeholder_2">>)->
    <<"test id 2!">>;
get_content(_)->
    <<"not found text!">>.
parse_text()->
Text=,
%在这里不起作用:
%Text=,
[\ux,Tail]=二进制:拆分(文本,[],[global]),
[Id ||]=二进制:拆分(尾部,[],[global]),
模式=,
替换=获取内容(Id),
结果=二进制:替换(文本、模式、替换),
io:fwrite(“~p\n”,[Result])。
获取内容()->
;
获取内容()->
;
获取内容(\)->
.
我的问题是,我应该进一步优化它以支持一个文本中的多个占位符,还是有更好的方法来处理这些问题


干杯

我不确定这是否是一个更好的主意,但它适用于多个占位符

parse_text(Input) ->
    List = lists:foldr(
        fun(E, Acc) ->
            case get_content(E) of
                <<"not found text!">> -> [E| Acc];
                Match -> [Match | Acc]
            end 
        end, [], binary:split(Input, [<<"{{{--">>, <<"--}}}">>], [global])
    ),
    erlang:list_to_binary(List).


get_content(<<"test_placeholder_1">>)->
    <<"test id 1!">>;
get_content(<<"test_placeholder_2">>)->
    <<"test id 2!">>;
get_content(_)->
    <<"not found text!">>.
parse_文本(输入)->
列表=列表:foldr(
乐趣(E,Acc)->
案例获取内容(E)
->[E | Acc];
匹配->[匹配| Acc]
结束
结束,[],二进制:拆分(输入,[,],[global])
),
erlang:list_到_二进制(list)。
获取内容()->
;
获取内容()->
;
获取内容(\)->
.
如果您需要更强大的工具来完成这样的任务

我觉得你应该检查ErlyDTL插件--