我正在尝试匹配以下 NMEA 字符串
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45
我在这个 link 中编写并测试了一个正则表达式
正则表达式如下
\$GPRMC,((?:[0-9]+)(?:\.(?:[0-9]+))?,|,)([A|V],|,)([0-9]+\.[0-9]+,|,)([N|S|E|W],|,)([0-9]+\.[0-9]+,|,)([N|S|E|W],|,)([0-9]+\.[0-9]+,|,)([0-9]+\.[0-9]+,|,)([0-9]+,|,)([0-9]+\.[0-9]+,|,)(.*)
我在 C 中使用 regex.h 头文件来编译头文件,下面是我的代码
#define NU [0-9]+
#define FLT NU\\.NU
regex_text= "\\$GPRMC,((?:NU)(?:\\.(?:NU))?,|,)([A|V],|,)(FLT,|,)([N|S|E|W],|,)(FLT,|,)([N|S|E|W],|,)(FLT,|,)(FLT,|,)(NU,|,)(FLT,|,)(.*)";
find_text = "$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45";
以下是我从 GDB 得到的错误 GDB 输出:
23 int status = regcomp (r, regex_text, REG_EXTENDED|REG_NEWLINE);
(gdb)
24 if (status != 0) {
(gdb)
26 regerror (status, r, error_message, MAX_ERROR_MSG);
(gdb)
27 printf ("Regex error compiling '%s': %s\n",
(gdb)
28 regex_text, error_message);
(gdb)
27 printf ("Regex error compiling '%s': %s\n",
(gdb)
Regex error compiling '\$GPRMC,((?:NU)(?:\.(?:NU))?,|,)([A|V],|,)(FLT,|,)([N|S|E|W],|,)(FLT,|,)([N|S|E|W],|,)(FLT,|,)(FLT,|,)(NU,|,)(FLT,|,)(.*)': Invalid preceding regular expression
29 return 1;
感谢任何帮助
最佳答案
POSIX 标准不支持您对 (?:NU)
的使用。在我的系统 (Clang) 上,如果我提取代码,错误消息显示:
Regex error compiling '(?:NU)': repetition-operator operand invalid
您可以使用 REG_ENHANCED
而不是 REG_EXTENDED
来解决此问题。或者您可以放弃非捕获组并改用捕获组:
"\\$GPRMC,((NU)...
顺便说一句,[N|S|E|W]
应该是 [NSEW]
。
关于c - NMEA 正则表达式匹配 : Invalid preceding regular expression error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36806005/