我可以匹配包含非ASCII字符的字符串吗?

时间:2015-03-05 06:00:09

标签: erlang

我正在编写一个程序,我在其中处理表格中的字符串,例如"\001SOURCE\001"。也就是说,字符串包含字母数字文本,每端的ASCII字符值为1。我正在尝试编写一个函数来匹配这些字符串。我尝过这样的比赛:

handle(<<1,"SOURCE",1>>) -> ok.

但比赛没有成功。我已尝试过这个主题的一些变化,但都失败了。

有没有办法匹配一个主要包含字母数字文本的字符串,但每端的非字母字符除外?

2 个答案:

答案 0 :(得分:2)

字符串是列表的语法糖。列表是一种类型,二进制文件是一种不同的类型,因此您的匹配功能尚未确定,因为您尝试将列表与二进制文件匹配(如果您尝试将{1, "STRING", 1}与其匹配,则会出现同样的问题,元组不列出。)

记住字符串是列表,我们有几个选项:

handle([1,83,84,82,73,78,71,1]) -> ok.

这样可以正常工作。另一种更易读(但更丑陋)的方法是使用字符文字:

handle([1, $S,$T,$R,$I,$N,$G, 1]) -> ok.

另一种方法是剥离非字符值,然后将其传递给处理程序:

handle(String) -> dispatch(string:strip(String, both, 1)).

dispatch("STRING") -> do_stuff();
dispatch("OTHER")  -> do_other_stuff().

而且,如果可能的话,最好的情况是你完全停止使用字符串作为文本值(如果可行)并直接处理二进制文件。二进制文件的语法非常友好,它们占用的资源更少,而且相当多的二进制操作比字符串/列表操作更有效。但这并不适合每一个案例! (但在处理套接字时它很棒......)

答案 1 :(得分:2)

您还可以执行以下操作

[1] ++ "SOURCE" ++ [1] == "\001SOURCE\001".

或使用list_to_binary转换为二进制,并将模式匹配转换为

<<1,"SOURCE",1>> == <<"\001SOURCE\001">>.
相关问题