正则匹配过渡组异常:无法同时捕获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
相关产品推荐
相关产品推荐

