如何在 Erlang 中将正则表达式与 receive 相匹配?

发布于 2024-10-12 23:42:52 字数 172 浏览 5 评论 0原文

有以下块:

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

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

There is the following block:

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

I am wondering if it is possible to match a regexp in Text and have a simple clause if the Text matches.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无边思念无边月 2024-10-19 23:42:52

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

您可以做得更好的一种情况是,如果您的正则表达式是 Text 的常量前缀,例如 "^some prefix",您可以在其中使用 “一些前缀”++ _Var 语法:

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

You can't do this directly in a pattern match (in this case a receive pattern) as there's no regular expression pattern. There is a regular expression library, so you can try the match after you receive the {text, Text} message, but it isn't the same as selectively receiving the message only if it matches a regular expression.

The one case you can do better than this is if your regular expression is a constant prefix of Text, like "^some prefix", where you can use the "some prefix" ++ _Var syntax:

receive
...
    {raw, Text = "some prefix" ++ _} ->
        send(Socket, Text),
        master(State);
...
end
夜吻♂芭芘 2024-10-19 23:42:52

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

我认为这种情况在可预见的未来不会改变。

You cannot use use regular expressions at all in patterns, at least not as regular expressions. Patterns have exactly the same structure as data constructors. This means that unless the regular expression is very simple and can be expressed as a pattern as in @archaelus example then there is no way to test the message without first removing it from the message queue. Then you can use the regular expression module to test the string and extract fields from it.

I don't see this changing in the foreseeable future.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文