#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);