elixir - заменить символы Юникода - PCRE не поддерживает \ L, \ l, \ N {name}, \ U или \ u - PullRequest
0 голосов
/ 24 мая 2018

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

см. удалить символы нулевой ширины пробела

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>"

1 Ответ

0 голосов
/ 24 мая 2018

Поскольку вы используете 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>"
...