You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:15:07