Dart中如何基于指定关键词集合拆分字符串且仅拆分首次匹配位置
Dart多关键词首匹配拆分实现方案
你可以通过正则匹配首个命中的关键词的方式实现需求,实现代码如下:
核心拆分函数
List<String> splitOnFirstKeyword(String input, List<String> splitters) { // 转义分隔符中的正则特殊字符,避免匹配异常 final escapedSplitters = splitters.map(RegExp.escape).join('|'); // 正则规则中\b为单词边界匹配,避免匹配到单词内部的字符,无需整词匹配可删除 final regExp = RegExp('\\b($escapedSplitters)\\b'); final firstMatch = regExp.firstMatch(input); if (firstMatch == null) { // 无匹配分隔符时的返回逻辑可按需调整 return [input]; } // 拆分后去除两端多余空格,不需要可删除trim()调用 return [ input.substring(0, firstMatch.start).trim(), input.substring(firstMatch.start).trim() ]; }
测试调用示例
void main() { const splitters = ['ABOVE', 'AT', 'NEAR', 'IN']; const testCases = [ "ALFALFA DITCH IN ECKERT CO", 'ANIMAS RIVER AT DURANGO, CO', 'ALAMOSA RIVER ABOVE WILSON CREEK IN JASPER, CO' ]; for (final input in testCases) { print('INPUT: $input'); print('OUTPUT: ${splitOnFirstKeyword(input, splitters)}\n'); } }
运行输出
INPUT: ALFALFA DITCH IN ECKERT CO OUTPUT: [ALFALFA DITCH, IN ECKERT CO] INPUT: ANIMAS RIVER AT DURANGO, CO OUTPUT: [ANIMAS RIVER, AT DURANGO, CO] INPUT: ALAMOSA RIVER ABOVE WILSON CREEK IN JASPER, CO OUTPUT: [ALAMOSA RIVER, ABOVE WILSON CREEK IN JASPER, CO]
可选调整说明
- 如果不需要整词匹配(比如允许匹配单词中间的关键词),把正则规则里的
\\b删除即可 - 如果有长关键词优先匹配的需求,先把splitters列表按字符串长度从大到小排序再传入即可
- 无匹配关键词时的返回逻辑可自行修改,比如要返回两个元素的列表可以改为
return [input, '']
内容的提问来源于stack exchange,提问作者PJ Hire
相关产品推荐
相关产品推荐

