String.Contains (Array? ..) - Фильтр плохого слова в VB.NET - PullRequest
4 голосов
/ 04 августа 2011

Есть ли способ проверить, содержит ли строка один из элементов в массиве?как это:

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 ]

11 голосов
/ 04 августа 2011

Я думаю, что это должно делать то, что вы хотите

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

7 голосов
/ 04 августа 2011

Цикл - это самый простой способ.

Однако, если вас беспокоит скорость, а не разборчивость, вы можете заменить весь массив одним регулярным выражением.

Я неэто хорошо с базовым синтаксисом (немного ржавым), но что-то вроде ...

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

Если список слов фиксирован, было бы лучше сделать плохие слова статическими.(Это то, что они называются в Basic? Я имею в виду переменную, которая инициализируется только один раз в жизни программы, а не каждый раз, когда она используется.) В конструкторе Regex можно установить флаг Compiled, который ускорит процессеще дальше (выражение скомпилировано при его создании, а не при его использовании).

В пространстве имен System.Text.RegularExpressions находится регулярное выражение.

1 голос
/ 04 августа 2011

Вы можете использовать запрос 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  
0 голосов
/ 12 февраля 2016

На самом деле использование REGEX не работало, если сравниваемая строка была частично найдена в строке регулярного выражения.Например, и мне не нужно использовать фактическое «плохое слово», но если бы строка, с которой вы сравнивали, была: «Я получил ошибку из-за ошибки и у меня действительно появился зуд», произвело бы истинное сравнение с использованием.IsMatch (), потому что, по-видимому, IsMatch использует тип содержимого.(ПРИМЕЧАНИЕ: в моем случае я сравниваю расширение файла и беспокоюсь только о тех, которые имеют расширение vb, xml или config. Один файл с расширением vbproj выдает совпадение с функцией Ismatch (), дажехотя моя строка regEx - «vb | config | xml»).

И наоборот, если вы используете этот метод: If Badwords.Any (Function (b) txt.ToLower (). Contains (b.ToLower ())) у вас та же проблема из-за использования функции contains ().Поэтому я изменил его на: Если Badwords.Any (Function (b) txt.ToLower () = (b.ToLower ())), и он работал отлично.

Спасибо за все ответы на этот вопрос,и я надеюсь, что это работает для вас сейчас.

Джерри

0 голосов
/ 04 августа 2011

Регулярное выражение может помочь.

Следующий код создает это регулярное выражение: 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 часть ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...