2016-04-23 50 views
3

我试图匹配以下NMEA串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; 

任何帮助表示赞赏

+0

如果你只是想分析NMEA字符串,为什么不只是基于逗号分割它。带有NMEA动词或命令和休息的第一个索引转到它的数据。 – Saleem

回答

0

您使用的(?:NU)不是POSIX标准的支持。在我的系统(铛),如果我提炼的代码,错误消息说:

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

您可以通过使用REG_ENHANCED代替REG_EXTENDED解决这个问题。或者你可以给你的非捕获组,并使用捕获组,而不是:

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

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

+1

看来REG_ENHANCED不受支持。 Gcc抛出一个错误“regex_check.c:23:42:错误:'REG_ENHANCED'未声明(首次在此函数中使用)”。我想保留这些团体。任何帮助表示赞赏 – Gaara