Как сопоставить регулярное выражение с receive в Erlang? - PullRequest
2 голосов
/ 21 января 2011

Есть следующий блок:

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

Мне интересно, можно ли сопоставить регулярное выражение в тексте и иметь простое предложение, если текст соответствует.

Ответы [ 2 ]

6 голосов
/ 21 января 2011

Вы не можете сделать это напрямую в сопоставлении с шаблоном (в данном случае с шаблоном получения), так как шаблон регулярного выражения отсутствует. Существует библиотека регулярных выражений, поэтому вы можете попробовать сопоставление после получения сообщения {text, Text}, но это не то же самое, что выборочное получение сообщения, только если оно соответствует регулярному выражению.

Единственный случай, когда вы можете добиться большего успеха, чем этот, - это если ваше регулярное выражение имеет постоянный префикс Text, например "^some prefix", где вы можете использовать синтаксис "some prefix" ++ _Var:

receive
...
    {raw, Text = "some prefix" ++ _} ->
        send(Socket, Text),
        master(State);
...
end
4 голосов
/ 22 января 2011

Вы не можете использовать регулярные выражения вообще в шаблонах, по крайней мере, не как регулярные выражения. Шаблоны имеют точно такую ​​же структуру, что и конструкторы данных. Это означает, что если регулярное выражение не является очень простым и может быть выражено в виде шаблона, как в примере @archaelus, то нет способа проверить сообщение, не удалив его сначала из очереди сообщений. Затем вы можете использовать модуль регулярных выражений для проверки строки и извлечения из нее полей.

Я не вижу, чтобы это изменилось в обозримом будущем.

...