String.Contains(Array?..) - VB.NET中的Badword过滤器

时间:2011-08-04 14:16:52

标签: vb.net arrays string

有没有办法检查一个String是否包含数组中的一个项目?像这样:

dim txt as String="badword1 you! you son of a badword2!!"
dim Badwords() as String = {"badword1","badword2","badword3"}
if txt.contains(Badwords()) then
'Whoa.. txt contains some bad vibrations..
end if

我可以使用一个循环,但如果它包含数组中的一个字符串,我可以检查一个字符串吗?

5 个答案:

答案 0 :(得分:11)

我认为这应该做你想做的事情

Dim txt As String = "badword1 you! you son of a badword2!!"
Dim Badwords() As String = {"badword1", "badword2", "badword3"}

If Badwords.Any(Function(b) txt.ToLower().Contains(b.ToLower())) Then
    'Whoa.. txt contains some bad vibrations..
    MessageBox.Show("You said a naughty word :P")
End If

您需要Import System.Linq

答案 1 :(得分:7)

循环是最简单的方法。

但是,如果您担心速度而不是易读性,则可以使用单个正则表达式替换整个数组。

我对基本语法(有点生疏)不太好,但有点像......

dim badwords as Regex = new Regex("badword1|badword2|badword3");
if badwords.IsMatch(txt) then

如果单词列表是固定的,最好将badwords设为静态。 (这是它们在Basic中调用的吗?我的意思是一个变量,它只在程序的生命周期中初始化一次,而不是每次使用它。)你可以在Regex构造函数中设置一个Compiled标志来加速更进一步(表达式在创建时编译,而不是在使用时编译)。

可以在System.Text.RegularExpressions命名空间中找到正则表达式。

答案 2 :(得分:1)

您可以使用linq查询:

    dim txt as String="badword1 you! you son of a badword2!!"
    dim Badwords() as String = {"badword1","badword2","badword3"} 
    dim result as integer = (from l as string in Badwords where txt.contains(l) select l).count
    if result > 0 then  
       'Whoa.. txt contains some bad vibrations..  
    end if  

答案 3 :(得分:0)

正则表达式可以提供帮助。

以下代码生成此正则表达式:badword1|badword2|badword3

dim txt as String="badword1 you! you son of a badword2!!"
dim Badwords() as String = {"badword1","badword2","badword3"}
dim regex as new Regex (String.Join("|", Badwords), RegexOptions.IgnoreCase)
if regex.IsMatch(txt) then
'Whoa.. txt contains some bad vibrations..
end if

您也可以通过在表达式的开头和结尾添加\b字边界检测来改进逻辑:

以下代码生成此正则表达式:\b(badword1|badword2|badword3)\b

dim regex as new Regex ("\b(" & String.Join("|", Badwords) & ")\b", RegexOptions.IgnoreCase)

修改:改进了\b部分答案。

答案 4 :(得分:0)

实际上,如果您在比较的字符串部分位于正则表达式字符串中,则使用REGEX不起作用。例如,我并不需要使用实际的"坏词",但如果你要比较的字符串是:"我有点错误,我真的得到了痒"将使用" IsMatch()"进行真正的比较。因为显然IsMatch使用了包含类型的东西。 (侧面注意:在我的使用中,我比较了文件的扩展名,只关心那些扩展名为vb,xml或config的文件。一个扩展名为vbproj的文件与Ismatch()产生匹配即使我的regEx字符串是" vb | config | xml")。

相反,如果你使用这个方法:如果Badwords.Any(函数(b)txt.ToLower()。包含(b.ToLower()))由于使用contains()你有同样的问题。所以我把它修改为:如果Badwords.Any(函数(b)txt.ToLower()=(b.ToLower()))并且它工作得很好。

感谢所有对此问题的回复,我希望现在对你有用。

杰里