我可以匹配包含非 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">>.
我正在编写一个程序,我在其中处理形式为 "[=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">>.