【问题标题】:Keyword search with negative keywords使用否定关键字进行关键字搜索
【发布时间】:2022-01-14 15:54:41
【问题描述】:

我有一个关于 Go 中关键字搜索的简单问题。

我想用正负关键字搜索一个字符串

func keyword(itemTitle string, keywords string) bool {
    splits := strings.Split(keywords, ",")
    for _, item := range splits {
        item = strings.TrimSpace(item)

        fmt.Println(strings.ToUpper(itemTitle))
        fmt.Println(strings.ToUpper(item))

        if strings.Contains(item,"-") {
            item = item[1:]
            if strings.Contains(strings.ToUpper(itemTitle), strings.ToUpper(item)) {
                return false
            }
        }

        item = item[1:]
        fmt.Println(strings.ToUpper(item))

        if strings.Contains(strings.ToUpper(itemTitle), strings.ToUpper(item)) {
            return true
        }
    }

    return false
}

这是我的搜索方法

func TestKeyword(t *testing.T) {
    test1 := "Pokemon Nintendo Switch Cool Thing"
    keywordTest1 := "+pokemon,-nintendo"

    if keyword(test1, keywordTest1) {
        fmt.Println("matched")
    } else {
        fmt.Println("test")
    }

    test2 := "Pokemon Cards Cool"

    if keyword(test2, keywordTest1) {
        fmt.Println("matched")
    } else {
        fmt.Println("test")
    }
}

我的测试用例 我理解为什么它不起作用,因为 +amd 是切片中的第一个,并且它的 ofc 将返回 true 并且不会测试任何其他类似 -radeon 的东西,但我只是有点不知道要做什么。

输出给定

matched
matched

预期输出

test
matched

【问题讨论】:

  • 实际问题是什么,能否包括实际和预期的输出
  • @AshishMJ 完成 :)

标签: go keyword


【解决方案1】:

我更新了你的搜索功能,但保留了签名

func keyword(itemTitle string, keywords string) bool {
    a := strings.ToUpper(itemTitle)
    b := strings.ToUpper(keywords)
    keys := strings.Split(strings.Replace(b, "-", " ", -1), ",")
    for _, key := range keys {
        key = strings.TrimSpace(key)
        if strings.Contains(a, key) {
            return true
        }
    }
    return false
}

并使用通过测试和失败测试更新您的测试功能,看看它是如何工作的。

func TestKeyword(t *testing.T) {
    test1 := "Pokemon Nintendo Switch Cool Thing"
    keywordTest1 := "+pokemon,-nintendo"

    if keyword(test1, keywordTest1) {
        t.Log("matched")
    } else {
        t.Fail()
    }

    test2 := "Pokemon Cards Cool"

    if keyword(test2, keywordTest1) {
        t.Log("matched")
    } else {
        t.Fail()
    }
}

关于第二个测试失败的关键字带有 + 的问题,如果需要,您可以通过正则表达式将其传递以仅获取字母数字字符。

【讨论】:

  • 嗯,我知道我不适合第二种情况,我会乱来看看我能做什么!谢谢你的帮助:)
  • 当然因为它上面有一个 +,就像我说的,如果你需要忽略非字母数字字符,你可以把它放在你的问题中,这将是一个不同的问题要解决。基本上需要使用正则表达式来提取字母数字字符。不过,我修复了你的两种方法:)
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 2010-11-02
  • 1970-01-01
  • 2011-06-14
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多