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

Can I match against a string that contains non-ASCII characters?

我正在编写一个程序,我在其中处理形式为 "[=11=]1SOURCE[=11=]1" 的字符串。也就是说,字符串包含字母数字文本,每端都有一个值为 1 的 ASCII 字符。我正在尝试编写一个函数来匹配这些字符串。我试过这样的匹配:

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

但是匹配没有成功。我尝试了一些关于这个主题的变体,但都失败了。

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

字符串是列表的语法糖。列表是一种类型,二进制文件是另一种类型,所以你的匹配没有成功,因为你试图将列表与二进制文件进行匹配(如果你试图将 {1, "STRING", 1} 与之匹配,元组是' t 列表)。

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

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().

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

您还可以执行以下操作

[1] ++ "SOURCE" ++ [1] == "[=10=]1SOURCE[=10=]1".

或使用 list_to_binary 和模式匹配转换为二进制

<<1,"SOURCE",1>> == <<"[=11=]1SOURCE[=11=]1">>.