0

对 Flutter 世界来说相当新,我一直在寻找一种内置方法,它可以部分匹配一个字符串值和列表中的一整组字符串。例如...

假设我正在查询字符串“Farmhouse Sides, Coleslaw”。

determineFood(String category) {


List<String> categoryArray = <String>[];

var breakFastWords = ["waffle", "toast", "pancake", "omelette", "Omelet"];
var lunchWords = ["salad", "sandwich", "soup", "burger", "pasta", "gyro", "hoagie"];
var dinnerWords = ["burger", "steak", "pork", "ribs"];
var sideWords = ["dressing", "drink", "mustard", "jelly", "peanuts", "coleslaw"];

test(String value) => value.contains(category);


if (breakFastWords.any(test))
{
  categoryArray.add("Breakfast");
}

即使使用带有 test(String value) 的函数,而不是将字符串与带有“contains”的列表进行直接比较,除非两个字符串完全匹配(即只有“coleslaw”和“coleslaw”),否则我无法获得匹配.

任何人都可以提出更好的方法来解决这个问题吗?

4

1 回答 1

1

有几种方法可以做到这一点。一个与您所做的非常接近;但是您需要.toLowerCase()在匹配字符串之前调用。另一种是使用正则表达式,你可以告诉它忽略大小写。

这是一个例子:

final breakfastWords = ["waffle", "toast", "pancake", "omelette", "Omelet"];
final lunchWords = ["salad", "sandwich", "soup", "burger", "pasta", "gyro", "hoagie"];
final dinnerWords = ["burger", "steak", "pork", "ribs"];
final sideWords = ["dressing", "drink", "mustard", "jelly", "peanuts", "coleslaw"];
final sideReg =  RegExp("(?:dressing|drink|mustard|jelly|peanuts|coleslaw)", caseSensitive: false);

bool isBreakfast(String string) {
  String toTest = string.toLowerCase();
  return breakfastWords.any((word) => toTest.contains(word));
}

bool isLunch(String string) {
  String toTest = string.toLowerCase();
  return lunchWords.any((word) => toTest.contains(word));
}

bool isDinner(String string) {
  String toTest = string.toLowerCase();
  return dinnerWords.any((word) => toTest.contains(word));
}

bool isSide(String string) {
  String toTest = string.toLowerCase();
  return sideWords.any((word) => toTest.contains(word));
}

bool isSideRegex(String string) {
  return sideReg.hasMatch(string);
}

void main() {
  String testString = "Farmhouse Sides, Coleslaw";
  
  if(isBreakfast(testString)) {
    print("It's breakfast");
  }
  
  if(isLunch(testString)) {
    print("It's lunch");
  }
  
  if(isDinner(testString)) {
    print("It's dinner");
  }
  
  if(isSide(testString)) {
    print("It's a side");
  }
  
  if(isSideRegex(testString)) {
    print("It's a side found with regex");
  }
}final breakfastWords = ["waffle", "toast", "pancake", "omelette", "Omelet"];
final lunchWords = ["salad", "sandwich", "soup", "burger", "pasta", "gyro", "hoagie"];
final dinnerWords = ["burger", "steak", "pork", "ribs"];
final sideWords = ["dressing", "drink", "mustard", "jelly", "peanuts", "coleslaw"];
final sideReg =  RegExp("(?:dressing|drink|mustard|jelly|peanuts|coleslaw)", caseSensitive: false);

bool isBreakfast(String string) {
  String toTest = string.toLowerCase();
  return breakfastWords.any((word) => toTest.contains(word));
}

bool isLunch(String string) {
  String toTest = string.toLowerCase();
  return lunchWords.any((word) => toTest.contains(word));
}

bool isDinner(String string) {
  String toTest = string.toLowerCase();
  return dinnerWords.any((word) => toTest.contains(word));
}

bool isSide(String string) {
  String toTest = string.toLowerCase();
  return sideWords.any((word) => toTest.contains(word));
}

bool isSideRegex(String string) {
  return sideReg.hasMatch(string);
}

void main() {
  String testString = "Farmhouse Sides, Coleslaw";
  
  if(isBreakfast(testString)) {
    print("It's breakfast");
  }
  
  if(isLunch(testString)) {
    print("It's lunch");
  }
  
  if(isDinner(testString)) {
    print("It's dinner");
  }
  
  if(isSide(testString)) {
    print("It's a side");
  }
  
  if(isSideRegex(testString)) {
    print("It's a side found with regex");
  }
}

另请注意,您可以直接从字符串中形成正则表达式:

final sideReg = RegExp("(?:${sideWords.join("|")})", caseSensitive: false);

于 2021-03-23T07:37:15.960 回答