go 解析字串

2021-10-02 14:36:03 字數 3053 閱讀 9714

有時,我們的程式收到的訊息不是json或者xml這樣的常用訊息體格式,就是乙個普通的string,比如下面這條訊息:

a呼叫失敗率過高

------

業務方:x專案

時間點:2020-01-10 16:25:00.360047+08:00

------

對程式而言,就是這樣乙個字串:

"a呼叫失敗率過高\n------\n業務方:x專案\n時間點:2020-01-10 16:25:00.360047+08:00\n------\n"
這樣的字串無法使用json或者xml包提供的函式去解析,只能我們手寫解析**。

我們的需求是,解析出報警型別,業務方,以及時間點,存到乙個map裡,這樣後續的處理就會更加方便。

使用strings包提供的函式,可以完成基本的字串解析功能。

常用的解析字串函式有以下幾個:

比如我們例子裡那條訊息,訊息標題和訊息內容之間是通過「------\n」這個子串來隔開的,那麼當我們解析這條訊息的時候,第一步應該是把標題和訊息內容分別解析出來。

strings包裡用於分割字串的函式是split,用法如下:

message := strings.split(src, sep)

//src:需要被分割的字串

//sep:用於分割字串的子串

//message:返回的是乙個string型別的陣列,儲存分割之後的多個子串

用例子裡的訊息做個測試:

message := strings.split(msg, "\n------\n")

fmt.println(len(message))

for msgid, submsg := range message

結果如下:

可以看到,字串中有兩個分割子串「\n------\n」,所以被分割為了3個子串,第乙個子串為訊息標題,第二個子串為訊息內容,最後乙個子串為空字串 。

有時候,乙個字串我們並不需要把每個字元都解析出來,我們只需要通過字串中是否包含特定子串,就可以知道訊息中我們需要的資訊。

strings包中,判斷子串是否存在的函式是contains,用法如下:

res := strings.contains(src, substr)

//src:源字串

//substr:想判斷是否存在的子串

//res:判斷結果,bool型別,存在為true,不存在為false

if strings.contains(message[0], "a呼叫")  else if strings.contains(message[0], "b呼叫")  else if strings.contains(message[0], "c呼叫")  else
這樣我們就獲取到了呼叫型別,並將其存入了calltype變數中。

在例子中,如果我們想獲取「業務方」資訊,首先需要從子串中找到「業務方:」這個子串的位置,然後再獲取其後面的內容。

strings包中用於查詢子串位置的函式是index,用法如下:

loc := strings.index(src, substr)

//src:源字串

//substr:需要查詢的字串

//loc:被查詢字串第一次出現的位置,如果未找到,返回-1

從示例字串獲取「業務方」的測試程式如下:

messagelen := len(message)

if loc := strings.index(message, "業務方"); loc < messagelen

return ""

}

程式中,在找到「業務方」出現的位置之後,需要從這個位置開始查詢第乙個「\n」,因為在這個「\n」前面的是業務方資訊,這裡需要提醒的是,strings.index(message[loc:], "\n")這一句的結果,是相對於loc開始的子串的位置,而不是在整個message的位置,這一點初次寫很容易遺忘,因此要注意。

最後給出解析例子中字串的完整程式:

package main

import (

"errors"

"fmt"

"strings"

)const alertmsg = "a呼叫失敗率過高\n------\n業務方:x專案\n時間點:2020-01-10 16:25:00.360047+08:00\n------\n"

func getvaluebykey(message, key string) string

return ""

} return ""

}func parsemsg(msg string) (string, map[string]string, error)

//根據報警標題確定呼叫型別

var calltype string

if strings.contains(message[0], "a呼叫") else if strings.contains(message[0], "b呼叫") else if strings.contains(message[0], "c呼叫") else

//根據報警訊息內容解析業務方,時間

var alertinfo map[string]string

for i := 1; i < len(message) - 1; i++

} return calltype, alertinfo, nil

}func main() else

}

注意上面程式中的細節,每個函式執行完,都要考慮到異常情況。程式執行結果如下:

go語言解析json字串

go語言解析json資料主要使用go語言自帶的json轉換庫encoding json 1.json.marshal函式 該函式的作用是主要物件轉換為json字串資料,函式原型如下 func marsha v inte ce byte,error 也就是說,這個函式接收任意型別的資料v,並將其轉換為...

解析字串

package com.practice.json import org.json.jsonarray import org.json.jsonexception import org.json.jsonobject import android.os.bundle import android.u...

字串解析

把字串中的元素分配到二維陣列中,例如把 1,2 3,4,5 6.7,把逗號和分號的內容分開放到二維陣列中 使用spring 中的spilt方法把字串分成兩個部分放到兩個一位陣列中,然後把兩個一位陣列 的內容放到二維陣列中 public class no6 public static void mai...