c - NMEA 正则表达式匹配 : Invalid preceding regular expression error

标签 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;

感谢任何帮助

最佳答案

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/

相关文章:

python - 这个cython代码可以优化吗?

c - C语言如何将一个文件的内容复制到另一个文件

#define 可以包含以前定义的变量吗?

javascript - 使用正则表达式查找单词之间的特定文本

java - Android 字符串替换全部不起作用

c - 内部闪存中 C 结构的对齐

c - 如何从另一个 C 程序中调用一个 C 程序

java - 字符串过滤器忽略正则表达式

Php pcre regex - 用反斜杠分割文本

javascript - 正则表达式匹配两个单词之间的字符串,其中结束边界词是可选的