Попытка извлечь информацию из электронной почты с помощью .NET Regex - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь извлечь некоторую информацию в области «отказ от ответственности» по электронной почте для продвижения акций (нежелательная почта для большинства).

Как правило, у заявителя будет отказ от ответственности:

Компания XYZ получила компенсацию в пятьдесят тысяч долларов за двухнедельную акцию ABC.

У меня есть регулярное выражение, которое работает в таких случаях (возможно, не самое эффективное в его нынешнем виде), и, похоже, работает в большинстве случаев. Однако, когда заявление об отказе от ответственности использует веб-адрес для ссылки на продвигающую компанию (например, www.companyxyz.com вместо Company XYZ), мое регулярное выражение получает «.com» и остальную часть фразы, которую я пытаюсь перехватить - не часть "www.companyxyz".

Вот мой метод регулярных выражений:

    public string ExtractCompensationLine(string message)
    {
        string compensationLine = string.Empty;
        string messageLine = Regex.Replace(message, "[\n\r\t]", " ");
        string leftPrefix = @"\.((\w|\s|\d|\,)+";
        string rightPrefix = @"(\w|\s|\d|\,)+\.)";

        string[] phrases = 
        {
            @"has been compensated",
            @"we were also paid",
            @"has been previously compensated",
            @"currently being compensated",
            @"the company has compensated",
            @"has agreed to be compensated",
            @"have been compensated up to",
            @"dollars from a third party",
            @"the company will compensate us"
        };

        foreach (string phrase in phrases)
        {
            string pattern = leftPrefix + phrase + rightPrefix;
            Regex compensationRegex = new Regex(pattern, RegexOptions.IgnoreCase);
            Match match = compensationRegex.Match(messageLine);

            if (match.Success)
            {
                compensationLine += match.Groups[1].Value;
            }
        }

        return compensationLine;
    }

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

1 Ответ

0 голосов
/ 01 декабря 2011

Если я правильно понимаю вашу проблему, учитывая предложение, содержащее одну из указанных фраз, вы хотите записать от начала этого предложения до его конца или конца строки. Ваша задача - найти конец предложения, предшествующего тому, которое вы хотите найти. Таким образом, вы должны соответствовать "." (Точка, за которой следует пробел.) Затем все остальное.

Я не понимаю, почему у вас есть "(\ w | \ s | \ d | \,)" вместо просто "." Это не даст результата, который я описал выше, но я оставлю это как есть, и просто сосредоточусь на проблеме, которую вы описали.

Так попробуйте это:

leftPrefix = @"(\.*\s+)*?((\w|\d|\,)+";

(. * \ S +) *: сопоставить любые символы, за которыми следует точка, за которой следует пробел.

Поскольку я использую парены для группировки этого нового подвыражения, у вас будет новая группа захвата, что означает, что вам нужно использовать коллекцию Captures объекта Match, а не Value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...