如何在模式匹配中将给定长度的变量字符串连接起来?

时间:2015-10-27 08:43:58

标签: regex pattern-matching elixir

我从串口切断的rfids接收到,我发现在这种情况下,匹配到新行的模式不起作用,因为在每个接收到的数据之后是“\ n”。 问题是如何连接即将到来的字符串,直到状态变量字符串将等于16长度?我已经在Ruby中测试了它,并且连接的输出字符串将是"\u00027A005AFA518B\r\n\u0003",我假设匹配的字符串长度将等于16,最终我想提取所需的rfid:7A005AFA518B。我可以用于此模式匹配吗?

当前数据处理程序:

def handle_info({:elixir_serial, serial, data}, state) do
  [head | _tail] = String.split(data, "\r\n")
  Logger.debug "head " <> head
  Logger.debug "tail #{_tail}"
  {:noreply, [data | state]}
end

使用rfid卡的双重检查记录:

[debug] 7A005
[debug] tail
[debug] AFA518B
[debug] tail

[debug] 7
[debug] tail
[debug] A005AFA518B
[debug] tail

1 个答案:

答案 0 :(得分:3)

您可以简单地检查字符串的大小。由于它是十六进制,您可以使用byte_size/1(对于unicode字符串也有String.length/1):

def handle_info({:elixir_serial, serial, data}, state) do
  [head | _tail] = String.split(data, "\r\n")
  new_state = state <> data
  case new_state do
    rfid when byte_size(rfid) == 12 ->
      #do something with RFID
      {:noreply, ""}
    _ ->
      {:noreply, new_state}
  end
end

确保在init函数中将初始状态设置为空字符串。