Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Erlang中替换字符串中的NUL字符(\x00)?_Regex_Erlang - Fatal编程技术网

Regex 如何在Erlang中替换字符串中的NUL字符(\x00)?

Regex 如何在Erlang中替换字符串中的NUL字符(\x00)?,regex,erlang,Regex,Erlang,当我像这样使用re:replace时,不会替换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字符(\x00)?只要将单个字符替换为另一个单个字符,列表:map可能更简单:

当我像这样使用re:replace时,不会替换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字符(\x00)?

只要将单个字符替换为另一个单个字符,
列表:map
可能更简单:

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

我怀疑
re:replace
的行为是因为它调用了PCRE库,而PCRE库不知何故不处理包含NUL字符的字符串。如果您尝试全局用空格替换空字符串,您将得到预期的结果。

只要您将一个字符替换为另一个字符,
列表:map
可能更简单:

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

我怀疑
re:replace
的行为是因为它调用了PCRE库,而PCRE库不知何故不处理包含NUL字符的字符串。如果您尝试用一个空格全局替换空字符串,您将得到预期的结果。

字符串是PCRE所理解的字符串的C概念,其中0被视为终止符。列表是Erlang所理解的全部,“字符串”是从一组特殊的值中提取成员的列表


PCRE库似乎将正则表达式视为“每个字符串之间”的意思,而将列表视为字符串列表,而不是字符列表。因此,它有效地将您的列表与您提供的值分开,而这并不是您想要的。Legocia的解决方案(将输入视为列表,而不是“字符串”)可能是最稳健的选择。

字符串是PCRE所理解的字符串的C概念,其中0被视为终止符。列表是Erlang所理解的全部,“字符串”是从一组特殊的值中提取成员的列表


PCRE库似乎将正则表达式视为“每个字符串之间”的意思,而将列表视为字符串列表,而不是字符列表。因此,它有效地将您的列表与您提供的值分开,而这并不是您想要的。Legocia的解决方案(将输入视为列表,而不是“字符串”)可能是最稳健的选择。

PCRE可以对二进制数据(即嵌入空字符)进行操作。但是,传递给PCRE的正则表达式模式必须是字符串。当您在Erlang中说“\x00”时,就像[0],它在正则表达式字符串中嵌入了一个空字节。因此,就PCRE而言,您刚刚告诉它应该使用的模式是一个空字符串,它匹配所有内容

幸运的是,这很容易用PCRE处理。PCRE本身理解\x表示法,这意味着如果传递\x00,它将匹配空字节。由于反斜杠是Erlang特有的,因此必须将其转义为“\\x00”


PCRE可以对二进制数据(即嵌入空字符)进行操作。但是,传递给PCRE的正则表达式模式必须是字符串。当您在Erlang中说“\x00”时,就像[0],它在正则表达式字符串中嵌入了一个空字节。因此,就PCRE而言,您刚刚告诉它应该使用的模式是一个空字符串,它匹配所有内容

幸运的是,这很容易用PCRE处理。PCRE本身理解\x表示法,这意味着如果传递\x00,它将匹配空字节。由于反斜杠是Erlang特有的,因此必须将其转义为“\\x00”