如何使用 RegEx 清理搜索文本

我可以使用下面的代码来搜索文本是否str包含任何一个或两个,即如果keys它包含“MS” or“动态”or这两个


package main


import (

    "fmt"

    "regexp"

)


func main() {

    keys := []string{"MS", "dynamics"}

    keysReg := fmt.Sprintf("(%s %s)|%s|%s", keys[0], keys[1], keys[0], keys[1]) // => "(MS dynamics)|MS|dynamics"

    fmt.Println(keysReg)

    str := "What is MS dynamics, is it a product from MS?"

    re := regexp.MustCompile(`(?i)` + keysReg)

    matches := re.FindAllString(str, -1)

    fmt.Println("We found", len(matches), "matches, that are:", matches)

}

我希望用户输入他的短语,所以我删除不需要的单词和字符,然后按照上面的方式进行搜索。假设用户输入是:This,is,a,delimited,string我需要keys动态构建变量(delimited string)|delimited|string以便我可以搜索str所有匹配项的变量,所以我写了以下内容:


    s := "This,is,a,delimited,string"

    t := regexp.MustCompile(`(?i),|\.|this|is|a`) // backticks are used here to contain the expression, (?i) for case insensetive

    v := t.Split(s, -1)

    fmt.Println(len(v))

    fmt.Println(v)

但我得到的输出是:


8

[      delimited string]

我清理输入文本的错误部分是什么,我希望输出是:


2

[delimited string]

这里是我的游乐场


白衣染霜花
浏览 147回答 1
1回答

莫回无

引用 Jamie Zawinski 的一句名言:有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。两件事情:不要尝试从字符串中清除垃圾(“清理”它),而是从中提取完整的单词。Unicode 是一个复杂的问题;因此,即使在您成功提取单词之后,您也必须确保您的单词被正确地“转义”,以便在构建它们的正则表达式之前不包含任何可能被解释为 RE 语法的字符。package mainimport (    "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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go