Для этого вам не нужно регулярное выражение, вы можете использовать String.split/3
:
defmodule Book do
def extract(text) do
text
|> String.split("book_name:", trim: true)
|> Enum.map(&String.split(&1, [":", ";"], trim: true))
|> Enum.map(fn [title, _, author1, _, author2] -> {title, author1, author2} end)
end
end
Вывод:
iex> Book.extract(text)
[{"SoftwareEngineering", "John", "Smith"}, {"DesignPatterns", "Foo", "Bar"}]
Для простоты я предположил, что тамбыли всегда два автора.Последний Enum можно заменить на этот, который обрабатывает случай, когда второго автора тоже нет:
|> Enum.map(fn
[title, _, author1] -> {title, author1, nil}
[title, _, author1, _, author2] -> {title, author1, author2}
end)