1 回答

TA貢獻1865條經驗 獲得超7個贊
引用 Jamie Zawinski 的一句名言:
有些人在遇到問題時會想“我知道,我會使用正則表達式”。現在他們有兩個問題。
兩件事情:
不要嘗試從字符串中清除垃圾(“清理”它),而是從中提取完整的單詞。
Unicode 是一個復雜的問題;因此,即使在您成功提取單詞之后,您也必須確保您的單詞被正確地“轉義”,以便在構建它們的正則表達式之前不包含任何可能被解釋為 RE 語法的字符。
package main
import (
"errors"
"fmt"
"regexp"
"strings"
)
func build(words ...string) (*regexp.Regexp, error) {
var sb strings.Builder
switch len(words) {
case 0:
return nil, errors.New("empty input")
case 1:
return regexp.Compile(regexp.QuoteMeta(words[0]))
}
quoted := make([]string, len(words))
for i, w := range words {
quoted[i] = regexp.QuoteMeta(w)
}
sb.WriteByte('(')
for i, w := range quoted {
if i > 0 {
sb.WriteByte('\x20')
}
sb.WriteString(w)
}
sb.WriteString(`)|`)
for i, w := range quoted {
if i > 0 {
sb.WriteByte('|')
}
sb.WriteString(w)
}
return regexp.Compile(sb.String())
}
var words = regexp.MustCompile(`\pL+`)
func main() {
allWords := words.FindAllString("\tThis\v\x20\x20,\t\tis\t\t,?a!,?delimited?,string?", -1)
re, err := build(allWords...)
if err != nil {
panic(err)
}
fmt.Println(re)
}
- 1 回答
- 0 關注
- 117 瀏覽
添加回答
舉報