我从网络套接字收到了一个字符串:
let websocket = new ClientWebSocket()
let source = new CancellationTokenSource()
let buffer = ArraySegment(Array.zeroCreate 32)
do! websocket.ConnectAsync(url, source.Token)
do! websocket.ReceiveAsync(buffer, source.Token)
let str = Encoding.ASCII.GetString buffer.Array
let trim1 = Regex.replace str "\0" String.Empty // result is empty string
let trim2 = Regex.replace str "\\0" String.Empty // result is empty string
let trim3 = str.TrimEnd [| '\\'; '0' |] // result is untouched
我显然试图修剪多余的空字符
在调试器中,str的值为" {\" type \":\" hello \"} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0"
打印时看起来像:{"键入":" hello"}这是有道理的,符号正在被正确解释。
我似乎无法在f#中执行这个简单的任务,我做错了什么?
答案 0 :(得分:6)
使用ASCII转义可以解决问题:
let trim3 = str.TrimEnd [| '\x00' |]
您也可以使用unicode转义序列转义它:
let trim3 = str.TrimEnd [| '\u0000' |]
您的正则表达式版本不起作用,因为在正则表达式中表示空字符的正确方法是ASCII escaping using "\x00"
, or unicode escaping using "\u0000"
。