enumSplitMatches function
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;
}