Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir-如何按每3个字符将字符串拆分为一个列表_Elixir - Fatal编程技术网

Elixir-如何按每3个字符将字符串拆分为一个列表

Elixir-如何按每3个字符将字符串拆分为一个列表,elixir,Elixir,如果我有字符串“ugguguuauaaugguuu”如何将其转换为一个列表,每3个字符将其拆分为[“UGG”、“UGU”、“UAU”、“UAA”、“UGG”、“uu”] 我还想知道是否有更优雅的版本这可以使用Stream.unfold/2功能实现。在某种程度上,它与reduce相反-reduce允许我们将集合折叠为单个值,而“展开”是指将单个值扩展为集合 作为Stream.unfold/2的生成器,我们需要一个返回元组的函数——第一个元素是生成集合的下一个成员,第二个元素是要传递到下一次迭代的累

如果我有字符串
“ugguguuauaaugguuu”
如何将其转换为一个列表,每3个字符将其拆分为
[“UGG”、“UGU”、“UAU”、“UAA”、“UGG”、“uu”]


我还想知道是否有更优雅的版本

这可以使用
Stream.unfold/2
功能实现。在某种程度上,它与
reduce
相反-reduce允许我们将集合折叠为单个值,而“展开”是指将单个值扩展为集合

作为
Stream.unfold/2
的生成器,我们需要一个返回元组的函数——第一个元素是生成集合的下一个成员,第二个元素是要传递到下一次迭代的累加器。这正好描述了函数
String.split_at/2
。最后,我们需要一个终止条件-
String.split_at(“,3)
将返回
{”“,”“}
。我们对空字符串不感兴趣,因此在遇到空字符串之前处理生成的流就足够了-这可以通过
Enum.take_while/2
实现

string
|> Stream.unfold(&String.split_at(&1, 3)) 
|> Enum.take_while(&(&1 != ""))

如果您的字符串只包含ASCII字符,并且字符串的
字节大小是3的倍数,那么有一个非常优雅的解决方案,它使用了一个鲜为人知的长生不老药功能:二进制理解:

iex(1)> string = "UGGUGUUAUUAAUGGUUU"
"UGGUGUUAUUAAUGGUUU"
iex(2)> for <<x::binary-3 <- string>>, do: x
["UGG", "UGU", "UAU", "UAA", "UGG", "UUU"]
iex(1)>string=“ugguuauuauuaugguuu”
“乌古古乌乌乌古乌乌乌古乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌乌

iex(2)>对于另一种可能性是使用
Regex.scan/2

iex> string = "abcdef"
iex> Regex.scan(~r/.{3}/, string)
[["abc"], ["def"]]

# In case the number of characters is not evenly divisible by 3
iex> string = "abcdefg"
iex> Regex.scan(~r/.{1,3}/, string)
[["abc"], ["def"], ["g"]]

# If you need to handle unicode characters, you can add the `u` modifier
iex> string = "Please try

List.flatten(Regex.scan(~r/.../, "UGGUGUUAUUAAUGGUUU"))
iex>string=“abcdef”
iex>Regex.scan(~r/{3}/,字符串)
[“abc”],[“def”]]
#如果字符数不能被3整除
iex>string=“abcdefg”
iex>Regex.scan(~r/{1,3}/,字符串)
[“abc”],[“def”],[“g”]]
#如果需要处理unicode字符,可以添加'u'修饰符
iex>string=“请尝试

["UGG", "UGU", "UAU", "UAA", "UGG", "UUU"]
你会得到

iex> String.split("UGGUGUUAUUAAUGGUUU", ~r/.{3}/, include_captures: true, trim: true)
["UGG", "UGU", "UAU", "UAA", "UGG", "UUU"]
资料来源:

如何使用:


通常,你想在字形边界处拆分,而不仅仅是代码点。在很多情况下,这会起作用,但它会中断,例如,对于表情符号。例如,
“ébcde”
(第一个字母是两个代码点,e和组合锐性),将变成
[“éb”,“cde”]
,你让我羞于在这里说“ugguuauauaugguu”“是测试套件中的一个精确匹配…一个非常好的用例,我还看到
展开
就像
迭代
一样有内存。干净优雅,我喜欢它!
["UGG", "UGU", "UAU", "UAA", "UGG", "UUU"]
iex> String.split("UGGUGUUAUUAAUGGUUU", ~r/.{3}/, include_captures: true, trim: true)
["UGG", "UGU", "UAU", "UAA", "UGG", "UUU"]