如何制作正则表达式以匹配模式之间带有随机点的字符串?

我想将一个字符串与一片模式进行比较,看看是否有任何带有点的模式排列:


函数看起来像这样:


patterns := []string{"cat", "fish", "dog"}

func HasBadPattern(word string, patterns []string) bool {       

    for _, p := range patterns {

        myRegex, err := regexp.Compile(p)

        if err != nil {

            log.Println(err)

        }

        //Don't know how to perpare the wordToCompile ?

        matched := myRegex.FindString(wordToCompile)

        if len(matched) > 0 {

            return true

            break

        }

    }

    return false

}

结果应该是这样的:


HasBadPattern("c.at", patterns) //true

HasBadPattern("c.a.t", patterns) //true

HasBadPattern("c.a..t", patterns) //true

HasBadPattern("fis.h", patterns) //true

HasBadPattern("catfish", patterns) //false

HasBadPattern("here is the cat.", patterns) //false

HasBadPattern("cat is on the mat.", patterns) //false

HasBadPattern("cat.fish", patterns) //false

我的问题是如何准备word为字符之间的点编译,而不会产生误报。


有只小跳蛙
浏览 135回答 2
2回答

尚方宝剑之说

看起来您基本上想\.*在字符串的字符之间插入(零个或多个句点)。例如"c.at","c.a.t"和"c.a..t"都由表达式匹配^\.*c\.*a\.*t\.*$。这可以使用类似的函数来完成(不是最有效的......):func randomDots(word string) string {    dots := "\\.*"    expression := fmt.Sprintf("^%s", dots)    for i := range word {        expression += fmt.Sprintf("%c%s", word[i], dots)    }    expression += "$"    return expression}然后你可以HasBadPattern改为:func HasBadPattern(word string, patterns []string) bool {    for _, p := range patterns {        expression := randomDots(p)        myRegex, _ := regexp.Compile(expression)        matched := myRegex.FindString(word)        if len(matched) > 0 {            return true        }    }    return false}

宝慕林4294392

匹配猫的情况。尝试遵循正则表达式。您的正则表达式实现在 golang 中可能有所不同,我使用https://regexr.com对其进行了测试,它工作正常。引用点特殊字符也可能是一个好主意。c[.]{0,}[.]a[.]{0,}[.]?t它通过了你的测试用例。如果您想匹配鱼或其他单词,那么您将动态地创建另一个正则表达式。玩得开心!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go