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]
。我的直觉是双引号以某种方式被保留,它看到一个开放的表达式,因此失败了。
我需要能够从 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]
。我的直觉是双引号以某种方式被保留,它看到一个开放的表达式,因此失败了。