ESP32使用Regexp库按正则掩码提取字符串无匹配如何解决
Arduino Regexp库正则匹配提取子串解决方案
匹配失败核心原因
你使用的Regexp.h库(Arduino生态通用的Nick Gammon实现版本)语法和通用PCRE正则有差异:
- 转义前缀为百分号
%而非反斜杠\,匹配数字需使用%d,而非通用正则的\d - 你测试时写的
"d{3}"是匹配3个连续的字面量字符d,自然无法匹配到目标内容
适配后的正确规则
匹配ABC3D97(3个大写字母+1个数字+1个大写字母+2个数字)的规则有两种写法,均可正常使用:
- 显式字符范围写法:
[A-Z]{3}%d[A-Z]%d{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
相关产品推荐
相关产品推荐

