Я пытаюсь удалить невидимые символы из строки

См. remove-zero-width-space-characters

iex> str = "\uFEFF<?xml>"
iex> String.replace(str, ~r/[\u200B\u200C\u200D\uFEFF]/, "")   
** (Regex.CompileError) PCRE does not support \L, \l, \N{name}, \U, or \u at position 1
    (elixir) lib/regex.ex:171: Regex.compile!/2
    (elixir) expanding macro: Kernel.sigil_r/2
    iex:44: (file)

Ошибка: PCRE does not support \L, \l, \N{name}, \U, or \u at position 1

Как я могу реализовать указанное выше регулярное выражение?

Примечание: при использовании строки вместо регулярного выражения это работает, но для эффективности кода я хотел бы использовать регулярное выражение

iex(34)> String.replace(a, "\uFEFF", "")
"<?xml>"
2
dina 24 Май 2018 в 14:53

1 ответ

Лучший ответ

Поскольку вы используете PCRE для сопоставления невидимых символов, используйте свойство \p{C}. Сюда входят все невидимые персонажи. В вашем случае ошибка связана с используемыми обозначениями. PCRE не поддерживает \uXXXX, но должны быть установлены флажки \x{XXXX} и u.

/[\x{200B}\x{200C}\x{200D}\x{FEFF}]/u

В коде:

iex(33)> str = "\uFEFF<?xml>"
iex(34)> String.replace(str, ~r/[\x{200B}\x{200C}\x{200D}\x{FEFF}]/u, "") 
"<?xml>"
2
dina 24 Май 2018 в 12:15