C中的清洁正则表达式代码?

时间:2013-03-18 20:11:10

标签: c regex glib software-design

我有一个C程序来处理一些shell命令的输出。对于'ps',我对以下五个领域感兴趣。我按名称指定了我想要的字段,为glib正则表达式引擎构建模式,然后解析并处理结果。

是否有一种很好的方法来组织产生可读和可维护代码的字段,模式和格式/类型?到目前为止我的工作,但看起来不那么好。我正在开发OS X,但稍后会想要移植到其他平台。

还有一种方法可以获得像C#的@ string运算符这样的行为来消除模式中的一半反斜杠吗?

感谢。

const char field_pid[] = "pid";
const char field_lstart[] = "lstart";
const char field_ruser[] = "ruser";
const char field_cputime[] = "cputime";
const char field_command[] = "command";

char pattern[] = "\\s*(?<pid>\\d+)\\s+(?<lstart>\\w+\\s+\\w+\\s+\\d+\\s+[\\d:]+\\s+\\d+)\\s+(?<ruser>\\w+)\\s+(?<cputime>[\\d:\\.]+)\\s+(?<command>.+)";

// Do the regex match.
...

// Extract the matching strings.
gchar *pid = g_match_info_fetch_named(match_info, field_pid);
gchar *lstart = g_match_info_fetch_named(match_info, field_lstart);
gchar *ruser = g_match_info_fetch_named(match_info, field_ruser);
gchar *cputime = g_match_info_fetch_named(match_info, field_cputime);
gchar *command = g_match_info_fetch_named(match_info, field_command);

// Parse and process the strings.
...

1 个答案:

答案 0 :(得分:1)

以下是一些改进选项:

  • 使用G_REGEX_EXTENDED选项编译模式。这将使模式中的空格被忽略,#可用于引入注释直到行尾。

  • 将正则表达式分成几行。

  • 从外部文件中读取正则表达式,而不是从C源中提取它。 (您可以为此编写实用程序功能,或使用glib的配置读取机制。)这是治疗反斜视炎的唯一方法。

除了最后一个建议,最终的正则表达式可能如下所示:

const char *pattern = "\
\\s*                                  \
(?<pid> \\d+ ) \\s+                   \
(?<lstart> \\w+ \\s+ \\w+ \\s+ \\d+ \\s+ [\\d:]+ \\s+ \\d+) \\s+    \
(?<ruser> \\w+) \\s+                  \
(?<cputime> [\\d:\\.]+) \\s+          \
(?<command> .+)                       \
"

还远非完美,但比你开始时更具可读性。