当我使用︰ 替换此类、 NUL 字符不会替换而替换插入之前的每个字符︰

1> S = [97, 0, 98].
[97,0,98]
2> R = re:replace(S, "x00", " ", [global, {return, list}]).
[32,97,32,0,32,98,32]

我认为R[97、 32、 98]此表达式问题是什么?如何替换字符串在 Erlang 中的 NUL character(x00)?

2014-12-31 00:00:00
问题评论:

回答:

只要您正在与另一个单字符替换单个字符,lists:map可能是更简单︰

R = lists:map(fun(0) -> 32; (C) -> C end, S).

我怀疑的行为re:replace因为它调用 PCRE 库,不会以某种方式处理使用 NUL 字符的字符串。您得到的结果是如果您尝试在全局范围内使用空格替换空字符串将预期。

PCRE 可以操作二进制数据 (即,嵌入式 null 字符)。但是,传递给 PCRE 的正则表达式模式必须是字符串。当您说"x00"在 Erlang 中,类似的 [0],它将 null 字节嵌入到正则表达式的字符串。因此只要 PCRE 而言,只是告诉您它应使用的模式是空字符串,相匹配的所有内容。

幸运的是,这很容易地处理具有 PCRE。PCRE 本身了解 x 表示法中,即如果 x00 传递它,它将匹配的空字节。由于反斜杠是 Erlang 到特殊,必须转义:"x00"。

1> S = [97, 0, 98].
[97,0,98]
2> R = re:replace(S, "x00", " ", [global, {return, list}]).
"a b"

字符串是什么 PCRE 理解,特别是,C 概念的 0 将被视为一个终结器的字符串。列表是所有 Erlang 都理解,"字符串",正在与来自特殊的一组值的成员的列表。

PCRE 库似乎将您的正则表达式视为"之间每个字符串"的含义并不字符列表中的列表的字符串形式。因此有效地分割与您提供的值,并不是您想您的列表。legoscia 的解决方案 (将该输入列表,不是"字符串"视作) 可能是最可靠的选择。

请输入您的翻译

How to replace a NUL character(x00) in a string in Erlang?

确认取消