我的問題是如何從這個多行文本中提取Count:, Temp:, Total:,后面的值。Used:Welcome, user [User CP] [Count: 1,014,747.1] [some] [Ohter: 0]Temp: 14.231 Total: 10.0 TB Used: 964.57 GB On line: 2 0 Traffic Count: 199510 (0 New) 0所以我可以得到這些值,,,1,014,747.1然后分配給一個像14.23110.0TB964.57GBstruct { Count float64 Temp float64 Total string Used string}我嘗試過使用正則表達式,但它導致我需要編寫四個正則表達式并使用相同的文本運行四次以逐個提取這些值。為什么我需要運行 4 次很清楚,因為我編寫了 4 個 regxp 來提取 for 值。var count = regexp.MustCompile(`(?m)(Count:\s*(\d+([\,]\d+)*([\.]\d+)))`)var temp = regexp.MustCompile(`(?m)(Temp:\s*(\d+[\.]?\d*))`)var total = regexp.MustCompile(`(?m)(Total:\s*(\d+\.?\d*\s\w\w))`)var used = regexp.MustCompile(`(?m)(Used:\s*(\d+\.?\d*\s\w\w))`)// run these regexp to get values我試過使用一個正則表達式,但匹配結果包含很多空元素,我無法通過固定索引獲取值。package mainimport ( "regexp" "fmt")func main() { var re = regexp.MustCompile(`(?m)(Count:\s*(\d+([\,]\d+)*([\.]\d+)))|(Temp:\s*(\d+[\.]?\d*))|(Total:\s*(\d+\.?\d*\s\w\w))|(Used:\s*(\d+\.?\d*\s\w\w))`) var str = `Welcome, user [User CP] [Count: 1,014,747.1] [some] [Ohter: 0]Temp: 14.231 Total: 10.0 TB Used: 964.57 GB On line: 2 0 Traffic Count: 199510 (0 New) 0` for i, match := range re.FindAllStringSubmatch(str, -1) { fmt.Println(match, "found at index", i) }}結果是,結果中有一些不同數量的空元素,所以我無法通過修復索引獲取值。[Count: 1,014,747.1 Count: 1,014,747.1 1,014,747.1 ,747 .1 ] found at index 0[Temp: 14.231 Temp: 14.231 14.231 ] found at index 1[Total: 10.0 TB Total: 10.0 TB 10.0 TB ] found at index 2[Used: 964.57 GB Used: 964.57 GB 964.57 GB] found at index 31,014,747.1在索引 2,14.231在索引 6,10.0 TB在索引 8,964.57 GB在索引 10。所以我無法通過使用固定索引來獲取值。https://regex101.com/r/jenOHn/3上更清晰的子組結果,匹配信息顯示了問題。那么有沒有更優雅的方式來提取這些值呢?值的順序可能會有所不同,并且在文本之間可能有一些額外的單詞(或遺漏了一些單詞),因此無法按計數長度進行提取。我曾考慮過使用有限狀態機,但不知道如何實現它,我也不確定這是一種正確的方法。
1 回答

慕斯709654
TA貢獻1840條經驗 獲得超5個贊
看起來你有大量的捕獲組,你實際上并沒有嘗試捕獲,還有很多不必要的指定的東西,還有一個丟失的s
標志。我已經清理了表達式并且它有效: https: //play.golang.org/p/D9WxFCYQ8s0
(?ms)Count:\s*([0-9,.]+).*Temp:\s*([0-9.]+).*Total:\s*([0-9.]+).*Used:\s*([0-9.]+)
- 1 回答
- 0 關注
- 198 瀏覽
添加回答
舉報
0/150
提交
取消