gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:41 28 4
gpt4 key购买 nike

我有一个 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.
...

最佳答案

这里有几个改进选项:

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

仍然远非完美,但比您开始时的可读性强得多。

关于C 中更清晰的正则表达式代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15485977/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com