2

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

有没有一种好方法来组织产生可读和可维护代码的字段、模式和格式/类型?我到目前为止的作品,但看起来不太好。我正在 OS X 上开发,但以后想移植到其他平台。

还有一种方法可以让 C# 的 @ 字符串运算符之类的行为消除模式中的一半反斜杠吗?

谢谢。

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.
...
4

1 回答 1

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> .+)                       \
"

仍然远非完美,但比您开始时更具可读性。

于 2013-03-18T20:29:50.000 回答