登录
首页 >  Golang >  Go问答

学习使用正则表达式来清理搜索文本

来源:stackoverflow

时间:2024-02-07 13:00:23 139浏览 收藏

对于一个Golang开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《学习使用正则表达式来清理搜索文本》,主要介绍了,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

问题内容

我可以使用下面的代码来搜索文本 str 是否包含任何或两个 keys,即是否包含“ms”or“dynamics”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]

这是我的演示


正确答案


引用 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)
}

进一步阅读:

今天关于《学习使用正则表达式来清理搜索文本》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>