Парсинг “Полученного” электронного письма: заголовки

Ниже приведено описание BigQuery Standard SQL

#standardSQL
SELECT *, 
  COUNTIF(type = 'A') OVER(
    PARTITION BY day ORDER BY time ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
  ) Count_of_A
FROM `project.dataset.table`   

с результатом

Row day time    type    col1    col2    col3    col4    Count_of_A   
1   Mon 9       A       a1      a2      a3      a4      0    
2   Mon 10      B       b1      b2      b3      b4      1    
3   Mon 12      A       c1      c2      c3      c4      1    
4   Mon 20      C       d1      d2      d3      d4      2    
5   Tue 9       A       e1      e2      e3      e4      0    
6   Tue 10      B       f1      f2      f3      f4      1    
7   Tue 11      B       g1      g2      g3      g4      1    
8   Tue 12      C       h1      h2      h3      h4      1    
9   Wed 9       A       i1      i2      i3      i4      0    
.
8
задан karlcow 10 February 2012 в 01:26
поделиться

6 ответов

Вы захотите использовать Регулярные выражения возможно

(? <=by).* (? = с)

Это даст Вам pilot01.cl.msu.edu (8.10.2/8.10.2)

Править: Я нахожу это забавным, что это кивнулось вниз, когда это на самом деле добирается что OP, относительно которого попросили.

C#:

string header = "Received: from server.mymailhost.com (mail.mymailhost.com [126.43.75.123]) by pilot01.cl.msu.edu (8.10.2/8.10.2) with ESMTP id NAA23597; Fri, 12 Jul 2002 16:11:20 -0400 (EDT)";
       System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"(?<=by).*(?=with)");
       System.Text.RegularExpressions.Match m = r.Match(header);
       Console.WriteLine(m.Captures[0].Value);
       Console.ReadKey();

Я не утверждал, что это было завершено, но задается вопросом, если человек, который дал ему-1, который даже попробовали. Meh..

1
ответ дан 5 December 2019 в 20:20
поделиться

vmime должен быть прекрасным, moreless любая почтовая библиотека позволит Вам делать это.

2
ответ дан 5 December 2019 в 20:20
поделиться

Формат, используемый 'Полученными' строками, определяется в RFC 2821, и regex не может проанализировать его.

(Можно попробовать так или иначе, и для ограниченного подмножества заголовков, произведенных известным программным обеспечением, за которым Вы могли бы следовать, но когда Вы присоедините это к диапазону странного материала, найденного в реальной почте, это перестанет работать.)

Используйте существующий синтаксический анализатор RFC 2821, и необходимо быть в порядке, но иначе необходимо ожидать отказ и записать программное обеспечение для преодоления его. Не основывайте ничего важного как система безопасности вокруг этого.

Мы должны извлечь сервером.

'от', более вероятно, будет полезен. Имя хоста, поданное строкой, как замечено самим хостом, таким образом, нет никакой гарантии, это будет публично разрешимый FQDN. И конечно Вы не склонны становиться допустимыми (Информация TCP) там.

5
ответ дан 5 December 2019 в 20:20
поделиться

Можно использовать регулярные выражения. Это было бы похоже на это (не протестированный):

#include <regex.h>

regex_t *re = malloc(sizeof(regex_t));

const char *restr = "by ([A-Za-z.]+) \(([^\)]*)\)";

check(regcomp(re, restr, REG_EXTENDED | REG_ICASE), "regcomp");

size_t nmatch = 1;

regmatch_t *matches = malloc(sizeof(regmatch_t) * nmatch);

int ret = regexec(re, YOUR_STRING, nmatch, matches, 0);

check(ret != 0, "regexec");

int size;

size = matches[2].rm_eo - matches[2].rm_so;
char *host = malloc(sizeof(char) * size);
strncpy(host, YOUR_STRING + matches[2].rm_so, size );
host[size] = '\0';

size = matches[3].rm_eo - matches[3].rm_so;
char *ip = malloc(sizeof(char) * size);
strncpy(ip, YOUR_STRING + matches[3].rm_so, size );
ip[size] = '\0';

проверка является макросом, чтобы помочь Вам выяснить, существуют ли какие-либо проблемы:

#define check(condition, description) if (condition) { fprintf(stdout, "%s:%i - %s - %s\n", __FILE__, __LINE__, description, strerror(errno)); exit(1); }
0
ответ дан 5 December 2019 в 20:20
поделиться

Не трудно проанализировать такие заголовки, даже вручную линию за линией. regex мог помочь там путем взгляда на by\s+(\w)+\(. Для C++ Вы могли попробовать ту библиотеку или что один.

-2
ответ дан 5 December 2019 в 20:20
поделиться

Вы рассмотрели использование регулярных выражений?

Вот список внутренних, non-routable диапазоны адресов.

-2
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: