如何在Erlang中匹配regexp和receive?

时间:2011-01-21 20:21:37

标签: regex erlang pattern-matching

有以下块:

receive
... 
  {raw, Text} ->
      send(Socket, Text),
      master(State);
...
end.

我想知道是否可以在Text中匹配正则表达式,并且如果Text匹配则有一个简单的子句。

2 个答案:

答案 0 :(得分:6)

您不能直接在模式匹配中执行此操作(在本例中为接收模式),因为没有正则表达式模式。有一个正则表达式库,因此您可以在收到{text, Text}消息后尝试匹配,但这与仅在与正则表达式匹配时有选择地接收消息不同。

如果您的正则表达式是Text的常量前缀,例如"^some prefix",您可以使用"some prefix" ++ _Var语法:

receive
...
    {raw, Text = "some prefix" ++ _} ->
        send(Socket, Text),
        master(State);
...
end

答案 1 :(得分:4)

你不能在模式中使用正则表达式,至少不能使用正则表达式。模式与数据构造函数具有完全相同的结构。这意味着除非正则表达式非常简单并且可以表示为@archaelus示例中的模式,否则无法在不先将消息从消息队列中删除的情况下测试消息。然后,您可以使用正则表达式模块来测试字符串并从中提取字段。

在可预见的未来,我没有看到这种变化。