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

ESP32使用Regexp库按正则掩码提取字符串无匹配如何解决

Arduino Regexp库正则匹配提取子串解决方案

匹配失败核心原因

你使用的Regexp.h库(Arduino生态通用的Nick Gammon实现版本)语法和通用PCRE正则有差异:

  • 转义前缀为百分号%而非反斜杠\,匹配数字需使用%d,而非通用正则的\d
  • 你测试时写的"d{3}"是匹配3个连续的字面量字符d,自然无法匹配到目标内容

适配后的正确规则

匹配ABC3D97(3个大写字母+1个数字+1个大写字母+2个数字)的规则有两种写法,均可正常使用:

  1. 显式字符范围写法:[A-Z]{3}%d[A-Z]%d{2}
  2. 库内置占位符写法:%u{3}%d%u%d{2}(%u代表任意大写字母)

修正后完整代码

#include <Regexp.h>

void setup ()    {
  Serial.begin (115200);

  // 匹配状态对象
  MatchState ms;

  // 待搜索的目标字符串
  char buf [100] = "The quick brown fox ABC3D97 jumps over the lazy wolf";
  ms.Target (buf);
  Serial.println (buf);

  // 替换为适配后的正则规则
  char result = ms.Match ("[A-Z]{3}%d[A-Z]%d{2}");
  
  if (result > 0)    {
    Serial.print ("匹配起始位置: ");
    int matchStart = ms.MatchStart;
    int matchLength = ms.MatchLength;
    Serial.println (matchStart);
    Serial.print ("匹配长度: ");
    Serial.println (matchLength);
    String text = String(buf);
    Serial.print("提取到的子串: ");
    Serial.println(text.substring(matchStart, matchStart + matchLength));
  }
  else
    Serial.println ("未匹配到结果。");
    
}

void loop () {}

运行输出示例

The quick brown fox ABC3D97 jumps over the lazy wolf
匹配起始位置: 20
匹配长度: 6
提取到的子串: ABC3D97

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:54:01