如何在Erlang中替换字符串中的字符?

4

我有一段代码,用于获取sessionid并将其转换为字符串,然后在redis中创建一个键值对集合,例如{{1401,873063,143916},<0.16443.0>}。现在我想要替换该session中的字符{为字母“a”。

OldSessionID= io_lib:format("~p",[OldSession#session.sid]),
StringForOldSessionID = lists:flatten(OldSessionID),
ejabberd_redis:cmd([["SADD", StringForSessionID, StringForUserInfo]]);

我尝试过这样做:

re:replace(N,"{","a",[global,{return,list}]).

这样做是好的吗?我读到在Erlang中使用正则表达式不是一个被建议的方法。

3个回答

10

您的解决方案可行,如果您对此感到满意,应该保留它。

在我的一侧,我更喜欢列表推导式: [case X of ${ -> $a; _ -> X end || X <- StringForOldSessionID ].(只是因为我不必检查函数文档:o)


如果我想要删除字符怎么办?我应该使用$\d而不是$a吗? - max
1
在这种情况下,您可以在列表推导式中使用过滤器,例如,如果您想跳过字符 { : [X || X <- StringForOldSessionID , X =/= ${] - Pascal

3
re:replace(N,"{","a",[global,{return,list}]).

Is this a good way of doing this? I read that regexp in Erlang is not a advised way of doing things.

根据官方文档,2.5 误解:字符串慢。实际上,如果处理不当,字符串处理可能会很慢。在Erlang中,您需要更多地考虑字符串的使用方法,并选择适当的表示方式。同时,如果要使用正则表达式,则应使用re模块而不是过时的regexp模块。因此,您可以使用re进行字符串操作,或者使用以下方法(使用模式匹配)将{留在原处。例如,如果 N 是 {{1401,873063,143916},<0.16443.0>},则{{A,B,C},Pid} = N,然后将 A、B、C 和 Pid 格式化为字符串。

0

自 Erlang OTP 20.0 起,您可以使用字符串模块中的 string:replace/3 函数。

string:replace/3 - 将 String 中的 SearchPattern 替换为 Replacement。第三个函数参数指示是否替换 SearchPattern 的前导、尾随或所有遇到的实例。

string:replace(Input, "{", "a", all).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接