這是一個選擇題的例子。我想在golang中獲取以下代碼內容中的“英國、法國”、“加拿大、墨西哥”、“加拿大、加拿大”、“墨西哥、德國”等中文文本,但是不行。
package main
import (
"fmt"
"regexp"
"testing"
)
func TestRegex(t *testing.T) {
text := `( B )38.目前,亞馬遜美國站后臺,除了有美國站點外,還有( )站點。
A.英國、法國B.加拿大、墨西哥
C.葡萄牙、加拿大D.墨西哥、德國
`
fmt.Printf("%q\n", regexp.MustCompile(`[A-E]\.(\S )?`).FindAllStringSubmatch(text, -1))
fmt.Printf("%q\n", regexp.MustCompile(`[A-E]\.`).Split(text, -1))
}
文本:
( B )38.目前,亞馬遜美國站后臺,除了有美國站點外,還有( )站點。
A.英國、法國B.加拿大、墨西哥
C.葡萄牙、加拿大D.墨西哥、德國
圖案: [A-E]\.(\S )?
實際結果:[["A.英國、法國B.加拿大、墨西哥" "英國、法國B.加拿大、墨西哥"] ["C.葡萄牙、加拿大D.墨西哥、德國" "葡萄牙、加拿大D.墨西哥、德國"]]。
期待結果: [["A.英國、法國" "英國、法國"] ["B.加拿大、墨西哥" "加拿大、墨西哥"] ["C.葡萄牙、加拿大" "葡萄牙、加拿大"] ["D.墨西哥、德國" "墨西哥、德國"]]
我認為這可能是貪婪模式問題。因為在我的代碼中,它直接將選項 A 和選項 B 讀取為一個選項。
uj5u.com熱心網友回復:
非貪婪匹配不會解決這個問題,您需要積極的前瞻,而re2不支持。
作為一種解決方法,可以只搜索標簽并手動提取兩者之間的文本。
re := regexp.MustCompile(`[A-E]\.`)
res := re.FindAllStringIndex(text, -1)
results := make([][]string, len(res))
for i, m := range res {
if i < len(res)-1 {
results[i] = []string{text[m[0]:m[1]], text[m[1]:res[i 1][0]]}
} else {
results[i] = []string{text[m[0]:m[1]], text[m[1]:]}
}
}
fmt.Printf("%q\n", results)
應該列印
[["A." "英國、法國"] ["B." "加拿大、墨西哥\n"] ["C." "葡萄牙、加拿大"] ["D." "墨西哥、德國\n"]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/375339.html
上一篇:一年中的持續時間
