enumSplitMatches function

List<List<RegExpMatch>> enumSplitMatches(
  1. List<String> splitText,
  2. List<List<String>> constantRules, {
  3. List<List<String>?>? templates,
  4. List<List<List<String>>?>? matchedFromTemplate,
  5. int matchMode = 1,
})

Implementation

List<List<RegExpMatch>> enumSplitMatches(
    List<String> splitText, List<List<String>> constantRules,
    {List<List<String>?>? templates,
    List<List<List<String>>?>? matchedFromTemplate,

    /// mode=1; 全部返回(默认)
    /// mode=2; 存在匹配(最小匹配,不继续匹配其他,但速度最快,用于快速检测是否有值)
    /// mode=3; 全称匹配(完整匹配)
    int matchMode = 1}) {
  var res = <List<RegExpMatch>>[];
  var allRules = <List<dynamic>>[];
  allRules.addAll(
      enumAllConstants(constantRules).map<List<dynamic>>((e) => [e, null]));
  if (templates != null && matchedFromTemplate != null) {
    allRules.addAll(
        enumSplitTemplates(constantRules, templates, matchedFromTemplate));
  }
  allRules.forEach((ruleWrapper) {
    final rule = ruleWrapper[0];
    final departTexts = ruleWrapper[1];
    var matches = <RegExpMatch>[];
    var splitTextIterable = splitText.expand<String>((element) =>
        (departTexts?.contains(element) ?? false) ? [] : [element]);
    var start = 0;
    var _inner = (String text) {
      Iterable<RegExpMatch> m;
      if ((m = RegExp(text).allMatches(rule, start)).isNotEmpty) {
        start = m.first.end;
        matches.add(m.first);
        return true;
      }
      return false;
    };
    switch (matchMode) {
      case 1:
        splitTextIterable.forEach(_inner);
        break;
      case 2:
        if (!splitTextIterable.any(_inner)) return;
        break;
      case 3:
        if (!splitTextIterable.every(_inner)) return;
    }
    if (matches.isNotEmpty) {
      res.add(matches);
    }
  });
  return res;
}