【发布时间】:2015-11-05 17:08:49
【问题描述】:
我想要一个匹配任何单个 UTF-8 字符的函数子句。
我可以像这样匹配特定字符
def foo("a") do
"It's an a"
end
但我无法确定是否可以对 any 单个 UTF8 字符执行相同操作。
我目前的解决方案是将字符串拆分为一个字符列表并在其上进行模式匹配,但我很好奇是否可以跳过该步骤。
【问题讨论】:
标签: utf-8 binary pattern-matching elixir
我想要一个匹配任何单个 UTF-8 字符的函数子句。
我可以像这样匹配特定字符
def foo("a") do
"It's an a"
end
但我无法确定是否可以对 any 单个 UTF8 字符执行相同操作。
我目前的解决方案是将字符串拆分为一个字符列表并在其上进行模式匹配,但我很好奇是否可以跳过该步骤。
【问题讨论】:
标签: utf-8 binary pattern-matching elixir
你可以这样做:
def char?(<<c::utf8>>), do: true
def char?(_), do: false
请注意,这仅匹配具有单个字符的二进制文件,要匹配字符串中的下一个字符,您可以这样做:
def char?(<<c::utf8, _rest::binary>>), do: true
【讨论】:
创建正则表达式时可用的修饰符有:...
unicode(u) - 启用像\p这样的 Unicode 特定模式,并更改像\w、\W、\s和朋友这样的修饰符以匹配 Unicode。它期望在匹配时给出有效的 Unicode 字符串dotall(s) - 使 dot 匹配换行符并将换行符设置为 anycrlf;根据:re文档,可以通过设置(*CR)或(*LF)或(*CRLF)或(*ANY)来覆盖新行设置
所以你可以尝试: ~r/./us
来自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
所以我认为你应该很高兴。
【讨论】:
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 支持的工作原理,请查看整个模块以更好地理解。
【讨论】: