2016-04-23 61 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