为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 RegEx 清理搜索文本

如何使用 RegEx 清理搜索文本

Go
白衣染霜花 2023-02-06 14:39:11
我可以使用下面的代码来搜索文本是否str包含任何一个或两个,即如果keys它包含“MS” or“动态”or这两个package mainimport (    "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]这里是我的游乐场
查看完整描述

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)

}


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号