elixir - 替换unicode字符 - PCRE不支持\ L,\ l,\ N {name},\ U或\ u

时间:2018-05-24 11:53:05

标签: regex elixir

我正在尝试从字符串

中删除不可见的字符

请参阅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>"

1 个答案:

答案 0 :(得分:2)

由于您使用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>"