假設我有這個大字串:
13242222160a06032c06cf00ca5c160bdc70102dfe0a12bc00a3b101000000cd01d60d0a13242222160a06032c0ccf00ca5bf10bdc74d029d05401fe0a12bc00a3b101000000d1e4270d0a1324222160a06032c1e0a12bc00a3b101000000d233ed0d0a
我希望將其拆分為陣列,前綴為 1324,后綴為 0d0a。結果是一個包含 3 個元素的陣列:
arr[0] = 13242222160a06032c06cf00ca5c160bdc70102dfe0a12bc00a3b101000000cd01d60d0a
arr[1] = 13242222160a06032c0ccf00ca5bf10bdc74d029d05401fe0a12bc00a3b101000000d1e4270d0a
arr[2] = 1324222160a06032c1e0a12bc00a3b101000000d233ed0d0a
這是我的代碼:
package main
import (
"fmt"
"regexp"
)
func main() {
var testData = "13242222160a06032c06cf00ca5c160bdc70102dfe0a12bc00a3b101000000cd01d60d0a13242222160a06032c0ccf00ca5bf10bdc74d029d05401fe0a12bc00a3b101000000d1e4270d0a1324222160a06032c1e0a12bc00a3b101000000d233ed0d0a"
re := regexp.MustCompile("^1324[0-9a-zA-Z]*0d0a")
matches := re.FindAllString(testData, -1)
for _, m := range matches {
fmt.Printf("%s\n", m)
}
}
它只是列印相同的整個字串,這很可能意味著我的正則運算式是錯誤的。正確的形式是什么?
uj5u.com熱心網友回復:
您的正則運算式有兩個問題。插入符號 ( ^) 表示您只想匹配字串的開頭,因此根據定義,您只會得到一個結果。另一個問題是,它*是一個貪婪的量詞,這意味著它將盡可能多地匹配以前的字符集。這意味著正則運算式將搜索到后綴的字串末尾,只有在找不到時才回溯。你想要的是一個不情愿的量詞,所以*?,它只匹配它可以滿足正則運算式的最小字符數。
放在一起,你的正則運算式字串應該是"1324[0-9a-zA-Z]*?0d0a". 我在 Go 操場上對其進行了測驗,它似乎得到了你想要的結果。https://go.dev/play/p/qolk3vHNxKT
uj5u.com熱心網友回復:
在關鍵字上使用strings.Split1324然后將其添加到每個條目的前綴會更簡單。
該results型別是一個字串切片,每個字串都由提供的分隔符分割。對其進行一次迭代以添加分隔符的前綴以獲得所需的結果
package main
import (
"fmt"
"strings"
)
func main() {
var output []string
var testData = "13242222160a06032c06cf00ca5c160bdc70102dfe0a12bc00a3b101000000cd01d60d0a13242222160a06032c0ccf00ca5bf10bdc74d029d05401fe0a12bc00a3b101000000d1e4270d0a1324222160a06032c1e0a12bc00a3b101000000d233ed0d0a"
results := strings.Split(testData, "1324")
for idx := range results {
if len(results[idx]) > 0 {
output = append(output, fmt.Sprintf("%s%s", "1324", results[idx]))
}
}
}
請注意,在我的 M1 Macbook Pro 上Split(),當與 Go 的基準測驗一起運行時,該示例的性能遠遠好于正則運算式選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/512030.html
標籤:正则表达式去
