使用某些分隔符拆分String而不在Elixir中删除该分隔符?

时间:2018-08-26 21:47:11

标签: regex string split elixir

我正在寻找一种在Elixir中拆分字符串而不删除用于拆分的模式的方法,String.split/3的行为如下

Row value    
1   A    
2   B    
3   C    
4   D    
5   E    
6   F    
7   G    
8   H    
9   I    

我正在寻找类似的东西

String.split "testZng", "Z"
# ["test", "ng"]

或者这样

String.split "testZng", "Z"
# ["test", "Zng"]

2 个答案:

答案 0 :(得分:4)

您可以使用lookarounds

Regex.split ~r/(?=Z)/, "testZng"
# ["test", "Zng"]

Regex.split ~r/(?<=Z)/, "testZng"
# ["testZ", "ng"]

(?=Z)是一个正向超前查询,它与字符串中紧随其后的Z字符相匹配。

(?<=Z)是正向查找,它与字符串中紧接Z的位置匹配。

答案 1 :(得分:0)

另一种可能的方法:

defmodule StackOverflow do
  def split(string, <<split_char_cp>> = split_char, split_pos \\ :split_after) do
    if String.contains?(string, split_char) do
      index = string |> to_charlist |> Enum.find_index(&(split_char_cp == &1))
      String.split_at(string, if(split_pos == :split_after, do: index + 1, else: index))
    else
      ""
    end
  end
end
# Used like this: 
# import StackOverflow
# split("TestZng","Z")  
# => {"TestZ","ng"}
# split("TestZng","Z",:split_before)
# => {"Test","Zng"}
# split("TestZng","h")
# => ""

我不确定这是否比RegEx环顾更好或更差。我只是为了完整性而提供它。