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 关注
- 103 浏览
添加回答
举报