Split String с некоторым разделителем, не удаляя этот разделитель в Elixir? - PullRequest
0 голосов
/ 27 августа 2018

Я ищу способ разделить строку в эликсире, не удаляя шаблон, использованный для разделения, String.split/3 ведет себя так

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

Я ищукак то так

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

или вот так

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

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Еще один потенциальный подход:

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.Я просто предлагаю это для полноты картины.

0 голосов
/ 27 августа 2018

Вы можете использовать lookarounds :

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

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

(?=Z) - это положительный прогноз, который соответствует местоположению в строке, за которым сразу следуетZ char.

(?<=Z) является положительным взглядом сзади, который соответствует местоположению в строке, которому непосредственно предшествует Z.

...