Как проверить, совпадают ли слова в списке со словами в строке

#regex #flutter #dart #match

Вопрос:

У меня есть список слов, которые находятся в списке строк

 List<String> badWords = [
  "bad", 
  "damn",
  //and other list of offensive words too
];
 

Теперь, если у меня есть строка, полученная от пользователя посредством ввода, я хочу просмотреть список и проверить, соответствует ли какое-либо из этих слов какому-либо слову в строке, возможно, с помощью регулярного выражения, например

 String text = msgController.text;
badWords.map((e) {
  //If any the words in the text matches any of the words in the list then print those words out
}).toList();
 

Ответ №1:

Я бы предложил разделить предложение и посмотреть, содержит ли массив плохие слова. Слишком замысловато, мы можем использовать регулярное выражение для разделения на несколько символов. Ниже приведен полный рабочий пример с комментариями:

 void main() {
  List<String> badWords = [
    "bad", "damn", //and other list of offensive words too
  ];
  List<String> sentences = [
    "bad developer, you broke production",
    "good dev, you did good job",
    "damn devs, they brake stuff"
  ];
  for(String sentence in sentences){
    if(isSentenceOffensive(sentence, badWords)){
      print('$sentence - is offensive!');
    }
  }
}

bool isSentenceOffensive(String sentence, List<String> badWords)
{
  /* here we use regex to split by either dot (.), comma (,), or space ( ) */
  List<String> words = sentence.split(RegExp(r"[., ]"));
  for (String word in words){
    if(badWords.contains(word)){
      return true;
    }
  }
  return false;
}
 

Результатом вышеизложенного является:

 bad developer, you broke production - is offensive!
damn devs, they brake stuff - is offensive!
 

Ответ №2:

Я бы просто повторил список и проверил, содержит ли строка какое-либо из слов.

 String text = msgController.text
for (var i in badWords) {
  if (text.contains(i)){
    // Do something
  }
}
 

Ответ №3:

Другие ответы довольно точны, .contains() это то, что я бы использовал, чтобы свериться со badWords списком. Если вы разделите text пробелы и сохраните их в другом списке, вы можете просмотреть этот список и проверить, существует ли в нем каждое слово badWords . Вот возможный способ сделать это:

 List<String> badWords = [
  "bad", 
  "damn",
  // and other list of offensive words too
];

String text = msgController.text;
final textWords = text.split(' ');

for(final word in textWords) {
  if (badWords.contains(word.toLowerCase())) {
    // do a thing with the bad word
    print(word);
  }
}
 

Также стоит отметить , что, повторяя текст вместо badWords этого, вы можете позвонить .toLowerCase() , чтобы убедиться, что вы проверяете наличие плохих слов без учета регистра (при условии, что вы сохраняете все значения badWords в нижнем регистре).

Ответ №4:

Вы можете использовать list.contains(x) ;

подробнее вы можете прочитать здесь.

Ответ №5:

 void main()
{
  List<String> stringlist = [
    // list of string data. here is the name
    'zeshan',
    'abid',
    'ali',
  ];
  
  // "zeshan" is the new string 
  print(stringlist.contains('zeshan'),);
}
 

результатом этого будет ..
правда.

Ответ №6:

Я бы использовал регулярное выражение, потому что оно позволяет сопоставлять только целые слова, и вы не хотите запрещать строки, такие как «бадминтон» или «убийца», только потому, что они содержат плохое слово. Это также позволяет легко игнорировать случай, что вы, вероятно, также захотите сделать.

   var badWordsRE = RegExp("\b(?:${badWords.join("|")})\b", caseSensitive: false);

  bool containsBadWords = badWordsRE.hasMatch(string);
 

Совпадения b только на границе слов, поэтому "bad" их не будет найдено "badminton" .

Это предполагает, что badWords список содержит только буквы и символы, которые не имеют значения в регулярном выражении, поэтому, если вы попытаетесь захватить ASCII-изображения или что-то подобное, вам, скорее всего, потребуется их избежать:

 var badWordsRE = RegExp(
    "\b(?:${badWords.map(RegExp.escape).join("|")})\b", 
    caseSensitive: false);