亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 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 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號