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

正则表达式前瞻与区间匹配问题:提取符合特定条件的数字

问题描述

现有超10万条特定结构字符串,示例如下:

'xxxxxx0AxxZZxxBBxxxxx1AxxxxxBB'            --Group1是1   
'xxxxxxxxx0AxxxxZZxxxxx1AxxxxxBBxxxx'           --Group1是1
'xxxxxx1AxxxxxBBxxxx0AxxxxZxxBBxxxxZZxxBBxxxxxxxx'  --Group1是0
'xxx0AxxxBBxxxZZxxxxBBxxxxxx1AxxxxZxxxxxBB'     --Group1是0

需要找到字符“A”前的数字,需满足两个条件:

  • 该“A”之后存在字符串“BB”;
  • 从“A”到其后续第一个“BB”之间,不存在“A”“BB”“ZZ”。

之前尝试的正则表达式(\d)A(?!.*ZZ).*BB存在问题:(?!.*ZZ)会检查整个字符串中是否存在ZZ,包括第一个“BB”之后的内容,导致匹配结果不符合预期,需要限制前瞻的检查范围。

解决方案

用这个正则就能解决你的问题:

(\d)A(?:(?!A|BB|ZZ).)*BB

正则逻辑说明

  • (\d):捕获A前面的数字,也就是你需要的Group1;
  • A:匹配目标字符A;
  • (?:(?!A|BB|ZZ).)*:这是关键的限制部分——它会逐个字符匹配A之后的内容,但每匹配一个字符前都会检查:从当前位置开始,不会出现A、BB、ZZ这三个字符串。这样就把检查范围严格限定在了A到第一个BB之间,不会涉及BB之后的内容;
    • (?:...):非捕获组,仅用于逻辑分组,不会额外生成捕获组,不影响你获取Group1的结果;
    • (?!A|BB|ZZ):负前瞻断言,确保当前位置后不会出现指定的三个字符串;
  • BB:匹配A之后的第一个BB,满足“该A之后存在BB”的条件。

匹配验证

针对给出的示例:

  1. 前两个字符串中,1AxxxxxBB部分符合所有条件,Group1捕获结果为1;
  2. 后两个字符串中,符合条件的分别是0AxxxxZxxBB和0AxxxBB,Group1捕获结果为0;
    完全符合预期的匹配结果。

内容的提问来源于stack exchange,提问作者Henrik Løv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:32:36