【问题标题】:How to make string.contains work with a list如何使 string.contains 与列表一起使用
【发布时间】:2015-01-13 01:02:54
【问题描述】:

所以我为某人制作了这个机器人,可以过滤掉 Skype 聊天中的脏话。 而不是让它让我的代码真的很长,我想要它,所以已经加载了一个巨大的诅咒词列表,例如:

If Msg.Contains("swear1") Or Msg.Contains("swear2") Then
    c.SendMessage("{---------Bot----------}" + vbNewLine + "DO NOT SWEAR!" + vbNewLine + "{-------------------------------------------}")
End If

我尝试创建一个数组和一个包含多个值的字符串,但效果并不好,因为在有人说出触发词后它没有执行该函数。所以我想知道是否有一种方法可以在不使用的情况下将大量的脏话放在一个列表中

Msg.Contains("swear1")

或者

Msg.Contains("swear2")

等等等等,所以一切都将保持在一点点。 任何帮助将不胜感激:)

【问题讨论】:

    标签: vb.net string contains


    【解决方案1】:

    你使用了一个誓言词集合,并对照它检查字符串。 .Any 方法获取数组并在内部创建一个 For/loop,其中 word 是该循环的变量名,并表示数组中的每个字符串,以使用我们的 SwearWords.Contains(word) 布尔表达式进行测试,如果有任何表达式等于True,然后它返回True

    Dim swearWordExists As Boolean = False
    Dim msg As String = "swear1! has a swear word with extra text but still found"
    Dim SwearWords As New List(Of String)
    ' fill it with your swear words
    SwearWords.AddRange(New String() {"swear1", "swear2", "etc..."})
    ' then
    If Not msg.Contains(" ") Then
      ' msg only has one word so check it
      If SwearWords.Contains(msg) OrElse SwearWords.Any(Function(words) msg.Contains(words)) Then
        swearWordExists = True
      End If
    Else
      Dim words = Regex.Split(msg, "\W")
      If Not words.Any(Function(word) SwearWords.Contains(word)) Then
        If words.Any(Function(word) SwearWords.Any(Function(swear) word.Contains(swear))) Then
          swearWordExists = True
        End If
      Else
        swearWordExists = True
      End If
    End If
    If swearWordExists Then
      MessageBox.Show("Why are you swearing?")
    End If
    

    【讨论】:

    • 您能否更具体地说明我如何用我的脏话字符串填写列表。有点菜鸟
    • 一次一个 SwearWords.Add("Damn") 或者你有另一个地方存放一堆它们吗?
    • 我能不能把它们全部放在一行中,这样我可以节省很多空间?
    • @Matty11233 Dim sw As New List(Of String) From {"swear1", "swear2", "swear3"} 并添加更多内容:sw.AddRange({"swear4", "swear5"})
    • @AndrewMorton 非常感谢,工作完美抱歉,我无法回复您,但仍然非常感谢
    【解决方案2】:

    一种简单但不是超级高效的方法是将字符串转换为列表,然后使用列表相交功能

    http://msdn.microsoft.com/en-us/library/vstudio/bb910215(v=vs.90).aspx

    【讨论】:

      【解决方案3】:

      你可以像这样压缩你的代码

      Dim swears = New List(Of [String])() From {"swear1", "swear2"}
      If Regex.IsMatch("[your message]", String.Format("({0})", String.Join("|", swears))) Then
          MsgBox("Don't swear!")
      End If
      

      swears 是你不想让别人说的所有脏话的清单

      它的作用是获取 'swears' 中的所有字符串并将它们放入以下格式:(swear1|swear2) 然后正则表达式将查看您的消息是否包含 'swear1' 或 'swear2' 等等,如果你有更多的话。

      【讨论】:

        猜你喜欢
        • 2013-10-20
        • 2016-01-02
        • 2020-09-11
        • 2015-12-09
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 2021-12-17
        相关资源
        最近更新 更多