我想有一个匹配任何单个UTF-8字符的函数子句。
我可以匹配像这样的特定字符
def foo("a") do
"It's an a"
end
但我无法确定是否可以为任何单个UTF8字符执行相同操作。
我目前的解决方案是将字符串拆分为字符列表并进行模式匹配,但我很好奇是否可以跳过该步骤。
答案 0 :(得分:8)
你可以这样做:
def char?(<<c::utf8>>), do: true
def char?(_), do: false
请注意,这仅匹配具有单个字符的二进制文件,以匹配字符串中的下一个字符,您可以这样做:
def char?(<<c::utf8, _rest::binary>>), do: true
答案 1 :(得分:1)
来自http://elixir-lang.org/docs/v1.0/elixir/Regex.html
The modifiers available when creating a Regex are: ...
unicode (u) - enables unicode specific patterns like \p and changes modifiers like \w, \W, \s and friends to also match on unicode. It expects valid unicode strings to be given on match
dotall (s) - causes dot to match newlines and also set newline to anycrlf; the new line setting can be overridden by setting (*CR) or (*LF) or (*CRLF) or (*ANY) according to re documentation
所以你可以试试: 〜 - [R /./我们
来自http://elixir-lang.org/crash-course.html
In Elixir, the word string means a UTF-8 binary and there is a String module that works on such data
所以我觉得你应该好好去。
答案 2 :(得分:0)
TL; DR:
for <<char <- "abc">> do
def foo(unquote(<<char>>)), do: "It's an #{unquote(<<char>>)}"
end
看看https://github.com/elixir-lang/elixir/blob/3eb938a0ba7db5c6cc13d390e6242f66fdc9ef00/lib/elixir/unicode/unicode.ex#L48-L52你可以在编译时为二进制中的每个字符生成函数(在我的例子中为"abc"
)。它是Elixir unicode支持的工作方式,请查看整个模块以便更好地理解。