NMEA正则表达式匹配:前面的正则表达式错误

时间:2016-04-23 02:34:25

标签: c regex

我正在尝试匹配以下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;

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

POSIX标准不支持您使用(?:NU)。在我的系统(Clang)上,如果我提炼代码,则会显示错误消息:

Regex error compiling '(?:NU)': repetition-operator operand invalid

您可以使用REG_ENHANCED代替REG_EXTENDED来解决此问题。或者您可以放弃非捕获组并改为使用捕获组:

"\\$GPRMC,((NU)...

顺便说一下,[N|S|E|W]应该是[NSEW]