在 haskell 中用单反斜杠替换双反斜杠

replace double backslash with single backslash in haskell

我想从字节串序列中替换“\\”(Data.ByteString) 用“\”,但由于“\”的内部转义,它不会起作用。 考虑以下示例:

原始字节串:

"9\DEL*02/9vr51=mA24"

存储在数据库中并从中重新读取后,我得到以下信息 字节串:

 "\"\159\DEL*\150\222/\129vr\205\241=mA\192\184\""

假设字节串被用作加密密钥,这 由于序列中的无效字符,现在是一个错误的键。 这个问题实际上是由错误的数据库表示引起的 (varchar 而不是 bytea),因为否则它会被视为无效的 utf-8 序列。 我尝试使用某种方式替换无效字符 split-modify-concat 方法,但我得到的只是没有 序列中的任何反斜杠,因为我无法插入单个反斜杠 成字节串。

真心求助

可能您需要 postgresql 表达式

substring(ByteString from e'^\"(.*)\"$')::bytea

这将给出可用于查询或 alter table-using DDL

bytea 结果

也许使用 read 对你有用:

import Data.ByteString.Char8 as BS

bad =  BS.pack "\"\159\DEL*\150\222/\129vr\205\241=mA\192\184\""

good = read (BS.unpack bad) :: BS.ByteString

-- returns: "9\DEL*02/9vr51=mA24"

您也可以使用 readMaybe 来进行更安全的解析。