gRegex 不解析 " 字符

gRegex not parsing " characters

我需要能够从 SMTP 邮件中提取 Mime Content-Type headers。为此,我正在使用 glib 库的 g_regex 部分,并且我创建了 this regular expression.

注意:在 g_regex 中,我将 [\s] 子模式更改为 (\r\n),因为后者 - 使用模型 Content-Type headers 更准确 - 显然无法识别通过正则表达式。生成的正则表达式是

((\r\n){2}((([--]{2,}[=][a-zA-Z0-9._]+)(\r\n))((((Content([\x2D][a-zA-Z]+)+)[:]([\x09\x0C\x20]*([a-zA-Z0-9\x2D]+([\x2F][a-zA-Z\x2D]+)?)[;]?)(\r\n))([\x09\x0C\x20]*[a-zA-Z]+[\x09\x0C\x20]*[=][\x22]?[a-zA-Z\x2D\x2E]+[\x22]?)?)(\r\n))+)(\r\n))

请在下面找到我的 C 代码:

GRegex *regex;
GMatchInfo *match_infoX;
gint start_content_pos, end_content_pos;

regex = g_regex_new("((\r\n){2}((([--]{2,}[=][a-zA-Z0-9._]+)(\r\n))((((Content([\x2D][a-zA-Z]+)+)[:]([\x09\x0C\x20]*([a-zA-Z0-9\x2D]+([\x2F][a-zA-Z\x2D]+)?)[;]?)(\r\n))([\x09\x0C\x20]*[a-zA-Z]+[\x09\x0C\x20]*[=][\x22]?[a-zA-Z\x2D\x2E]+[\x22]?)?)(\r\n))+)(\r\n))", 0, 0, NULL);
g_regex_match(regex, SMTP_Message_string, 0, &match_info);
while (g_match_info_matches(match_info))
{
    start_content_pos = end_content_pos = -1;

    gchar *word = g_match_info_fetch(match_info, 0);
    g_match_info_fetch_pos(match_infoX, 0, &start_content_pos, &end_content_pos);

    g_print("Found: %s\n", word);
    g_free(word);
    g_match_info_next(match_info, NULL);
}
g_match_info_free(match_info);
g_regex_unref(regex);

我有以下问题:

由于某些奇怪的原因,正则表达式在 regexr 上工作 - link 上面 - 但是当与 g_regex 一起使用时,没有明显的原因惨败。具体来说,在 g_regex 中,子表达式

((\r\n){2}((([--]{2,}[=][a-zA-Z0-9._]+)(\r\n)) ((((Content([\x2D][a-zA-Z]+)+)[:]([\x09\x0C\x20]*([a-zA-Z0-9\x2D]+([\x2F][a-zA-Z\x2D]+)?)[;]?)(\r\n))([\x09\x0C\x20]*[a-zA-Z]+[\x09\x0C\x20]*[=])))))

工作正常,但是

((\r\n){2}((([--]{2,}[=][a-zA-Z0-9._]+)(\r\n)) ((((Content([\x2D][a-zA-Z]+)+)[:]([\x09\x0C\x20]*([a-zA-Z0-9\x2D]+([\x2F][a-zA-Z\x2D]+)?)[;]?)(\r\n))([\x09\x0C\x20]*[a-zA-Z]+[\x09\x0C\x20]*[=][\x22]?)))))

不是,这意味着问题出在 [\x22] - " 字符中。我不明白哪里出了问题。我用Hex veiwer检查过,十六进制代码确实是22.

问题出在哪里?可能是油嘴滑舌的错误,还是我遗漏了什么?

幽默一下,试试这个代码:

regex = g_regex_new("((\r\n){2}((([--]{2,}[=][a-zA-Z0-9._]+)(\r\n)) ((((Content([\x2D][a-zA-Z]+)+)[:]([\x09\x0C\x20]*([a-zA-Z0-9\x2D]+([\x2F][a-zA-Z\x2D]+)?)[;]?)(\r\n))([\x09\x0C\x20]*[a-zA-Z]+[\x09\x0C\x20]*[=][\x22\x22]?)))))", 0, 0, NULL);
g_regex_match(regex, SMTP_Message_string, 0, &match_info);

如果您仔细观察,我将您的正则表达式的末尾更改为 [\x22\x22]。我的直觉是双引号以某种方式被保留,它看到一个开放的表达式,因此失败了。