2016-03-22 3 views
0

Пример: "? ? ?" ->"1 2 3"Как заменить все вхождения? в строке со счетчиком в Эликсире?

Похоже, это не может быть сделано с Regex.replace:

Regex.replace ~r/\?/, "? ? ?", fn(token) -> ...some code here... end 

, потому что нет никакого способа, чтобы иметь изменяемую счетчик.

+0

Это можно сделать - для этого вам не нужен изменяемый счетчик. У меня нет времени для разработки точного кода прямо сейчас, но это будет по линии Enum.map. –

ответ

4

Вы правы, вы не можете заменить изменяемый счетчик в Regex, поэтому вам придется рекурсивно менять вопросительные знаки по одному. @JustMichael ответ выглядит красиво. Если между вопросительными знаками может быть что-то другое, кроме пробелов, я бы сделал это следующим образом:

def number_question_marks(string), do: number_question_marks("", string, 1) 

#helper takes previous and current string 
#if nothing changes we end recursion 
def number_question_marks(string, string, _), do: string 

#if something changed we call recursively 
def number_question_marks(_previous, string, counter) do 
    new = Regex.replace(~r/\?/, string, inspect(counter), global: false) 
    number_question_marks(string, new, counter + 1) 
end 
3
"? ? ?" 
    |> String.split(" ") 
    |> Enum.map_reduce(1, fn(x, acc) -> {acc, acc + 1} end) 
    |> elem(0) 
    |> Enum.join(" ") 

Это работает, но я думаю, что существует более короткий способ сделать это.

+0

это заменит все, разделенное пробелами, возможно, это то, чего хочет OP? Твой путь был методом, который впервые пришел мне на ум. –

Смежные вопросы