【问题标题】:How to do pattern matching for erlang string (list)?如何为erlang字符串(列表)进行模式匹配?
【发布时间】:2017-04-28 13:25:11
【问题描述】:

我有一个字符串"{request, {M, F, A}}",我知道它的类型是列表,但是我不能使用[..]进行模式匹配。如何从中提取request{M, F, A}

【问题讨论】:

  • 这里的 M、F 和 A 是否不同,或者您的意思是特定字符“M”、“F”和“A”?如果它们不同,则需要一些更灵活的解析;模式匹配还不够强大。与请求部分相同 - 它是一个原子,还是一个可以变化的字段? erl_scan:string() 后跟 erl_parse:parse_term() 可能就是你所需要的。

标签: erlang


【解决方案1】:

您可以在字符串的开头进行模式匹配。你可以试试这样的:

1> Strip = fun(Input) -> lists:reverse(tl(lists:reverse(Input))) end.
#Fun<erl_eval.6.54118792>
2> Parse = fun(Input) ->
2>    "{" ++ Tail = Input,
2>    case Tail of
2>       "request, " ++ MFT -> {request1, Strip(MFT)};
2>       "request2, " ++ MFT -> {request2, Strip(MFT)}
2>    end
2> end.
#Fun<erl_eval.6.54118792>
3> Parse("{request, {M, F, A}}").
{request1,"{M, F, A}"}
4> Parse("{request2, {M, F, A}}").
{request2,"{M, F, A}"}
5>

【讨论】:

    【解决方案2】:

    如果您确定该字符串与"{request, {M, F, A}}" 完全一样,您可以像这样匹配它:

    [_, $r, $e, $q, $u, $e, $s, $t, _, _, ${, $M, _, $F, _, $A, $}, _] = "{request, {M, F, A}}"
    

    你可以玩这个

    【讨论】:

      猜你喜欢
      • 2015-02-19
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多