Эликсир сплит строка с регулярным выражением - PullRequest
0 голосов
/ 17 октября 2019

У меня есть следующая строка, мне нужно разделить строки, сохраняя разделители

>>String.split("hello()", ~r{(?=\W)|(?=\d)(?<=\D)})
>>["hello","(",")"]

В этом случае работает правильно, но мне нужно добавить некоторые изменения, и я не знаю, как это сделать.

Он должен разделять строки: "-a" "(b" и т. Д., И он не разделяет их. Поэтому мне нужно:

>>["-","a"]

Не нужно разделятьстроки с номерами "hello1". Мне нужно:

>>["hello1"]

1 Ответ

0 голосов
/ 21 октября 2019

Лучший способ добиться этого - вообще не использовать регулярные выражения, как это можно легко сделать с помощью сопоставления с образцом (если вам не нужно обрабатывать Unicode):

defguard is_alnum(c) when c in ?a..?z or c in ?A..?Z or c in ?0..?9

def parse(string), do: do_parse(string, "", [])

defp do_parse("", "", tokens), do: Enum.reverse(tokens)
defp do_parse("", curr, tokens), do: Enum.reverse([curr | tokens])

defp do_parse(<<c, rest::binary>>, curr, tokens) when is_alnum(c) do
  do_parse(rest, curr <> <<c>>, tokens)
end

defp do_parse(<<c, rest::binary>>, "", tokens) do
  do_parse(rest, "", [<<c>> | tokens])
end

defp do_parse(<<c, rest::binary>>, curr, tokens) do
  do_parse(rest, "", [<<c>>, curr | tokens])
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...