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

正则匹配过渡组异常:无法同时捕获exiting与entering部分

正则匹配完整Transition组的问题分析与修复

问题根源

你当前的主正则表达式因为**|的优先级低于-**,导致整个表达式被拆成了四个独立匹配分支,而非把exiting-entering作为一个整体匹配:

原正则的实际匹配分支:
1. (?<exitingN>N)
2. ((?<exitingF>[UMTREL])(?<exitingNumber>[0-9]+))-
3. (?<enteringB>B)
4. ((?<enteringF>[UMTREL])(?<enteringNumber>[0-9]+))\s+

这就导致正则会单独匹配N、U0-、M1这类片段,而非完整的N-U0、U0-M1结构。

另外你的enteringRegex问题同样源于|的优先级:表达式被拆成了-(?<enteringB>B)和((?<enteringF>[UMTREL])(?<enteringNumber>[0-9]+))两个分支,第二个分支没有和-绑定,所以会单独匹配所有UMTREL+数字的片段(包括exiting部分)。

修复方案

需要把exiting的两种可能(N / UMTREL+数字)用非捕获组包裹成一个整体,entering的两种可能(B / UMTREL+数字)也包裹成一个整体,中间用-连接,最后匹配分隔用的空白符(兼容末尾无空白的情况)。

正确的正则表达式

static RegExp regex = RegExp(
  r'(?:(?<exitingN>N)|(?<exitingF>[UMTREL])(?<exitingNumber>\d+))-(?:(?<enteringB>B)|(?<enteringF>[UMTREL])(?<enteringNumber>\d+))\s*',
);
  • (?:...)是非捕获组,用来把多个分支包裹成一个整体,不干扰命名捕获组的结构
  • \d等价于[0-9],写法更简洁
  • \s*匹配0或多个空白符(包括换行),兼容最后一个transition末尾无空白的场景

使用示例

final input = "N-U0 U0-M1\nM1-T9 T9-R10 R10-E19\nE19-L100 L100-B\n";
final matchList = regex.allMatches(input);

for (final match in matchList) {
  // 提取exiting部分
  final exiting = match.namedGroup('exitingN') ?? "${match.namedGroup('exitingF')}${match.namedGroup('exitingNumber')}";
  // 提取entering部分
  final entering = match.namedGroup('enteringB') ?? "${match.namedGroup('enteringF')}${match.namedGroup('enteringNumber')}";
  
  print("完整Transition: $exiting -> $entering");
}

输出结果

完整Transition: N -> U0
完整Transition: U0 -> M1
完整Transition: M1 -> T9
完整Transition: T9 -> R10
完整Transition: R10 -> E19
完整Transition: E19 -> L100
完整Transition: L100 -> B

补充说明

  • 命名捕获组未匹配时会返回null,所以处理时需要用??做空值兜底
  • 如果不需要单独捕获数字部分,也可以简化为(?<exiting>N|[UMTREL]\d+)-(?<entering>B|[UMTREL]\d+)\s*,后续按需拆分即可

内容的提问来源于stack exchange,提问作者GuiRitter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:47:37