我有一个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.
...
答案 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> .+) \
"
还远非完美,但比你开始时更具可读性。