Как удалить заключенный в кавычки текст из электронного письма и только показать новый текст

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

Как правило, Вы будете видеть это:

1-я электронная почта (запускаются разговора),

This is the first email

2-я электронная почта (отвечают на первый),

This is the second email

Tim said:
This is the first email

Вывод этого был бы, "Это - вторая электронная почта" только. Хотя различные почтовые клиенты заключают текст в кавычки по-другому, если бы там должны были некоторым образом получить главным образом новый почтовый текст только, который также был бы приемлем.

14
задан Tim 5 March 2010 в 08:12
поделиться

4 ответа

Если предыдущие письма хранятся на диске или доступны каким-то образом, можно проверить все письма, отправленные определенным получателем, чтобы определить, какой из них является текстом ответа.

Вы также можете попытаться определить символ кавычек, проверяя первый символ последних строк. Обычно последние строки всегда начинаются с одного и того же символа.

Если две последние строки начинаются с разных символов, попробуйте проверить первые строки, потому что иногда ответ добавляется в конец текста.

Если вы обнаружили этот символ, вы можете удалить последние строки, начинающиеся с этого символа, пока не будет обнаружена пустая строка или строка, начинающаяся с другого символа.

НЕ ПРОВЕРЕНО и больше похоже на псевдокод

    String[] lines;

    // Check the size of the array first, length > 2
    char startingChar = lines[lines.length - 1].charAt(0);
    int foundCounter = 0;
    for (int i = lines.length - 2; i >=0; --i) {
        String line = lines[i];

        // Check line size > 0
        if(startingChar == line.charAt(0)){
            ++foundCounter;
        }
    }

    final int YOUR_DECISION = 2; // You can decide
    if(foundCounter > YOUR_DECISION){
        deleteLastLinesHere(startingChar, foundCounter);
    }
2
ответ дан 1 December 2019 в 12:13
поделиться

Наблюдая за поведением Gmail в этом отношении, я заметил их стратегию:

  1. написать полное второе письмо.
  2. Добавьте текст вроде: В [отметку времени] [имя первого отправителя электронного письма] <[адрес электронной почты первого отправителя]> написал:
  3. Добавьте полное первое электронное письмо. a. Если ваше электронное письмо представляет собой обычный текст, добавьте '>' перед каждой строкой первого письма. b. Если это в HTML, Gmail предоставляет левое поле, например:

    border-left: 1px solid #CCC; margin: 0px 0px 0px 0.8ex; padding-left: 1ex; { {1}} таблица стилей агента пользователя цитата

    , а затем добавляет текст первого письма.

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

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

Вы получите это почти правильно, используя пару строк кода:

String newMessage = "";
for (String line : emailLines) {
  if (!line.matches("^[>].*")) {
    newMessage = newMessage.concat(line);
  }
}

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

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

Я использую следующее регулярное выражение (я), чтобы сопоставить отрывок для цитируемого текста (последнее - то, которое имеет значение):

  /** general spacers for time and date */
  private static final String spacers = "[\\s,/\\.\\-]";

  /** matches times */
  private static final String timePattern  = "(?:[0-2])?[0-9]:[0-5][0-9](?::[0-5][0-9])?(?:(?:\\s)?[AP]M)?";

  /** matches day of the week */
  private static final String dayPattern   = "(?:(?:Mon(?:day)?)|(?:Tue(?:sday)?)|(?:Wed(?:nesday)?)|(?:Thu(?:rsday)?)|(?:Fri(?:day)?)|(?:Sat(?:urday)?)|(?:Sun(?:day)?))";

  /** matches day of the month (number and st, nd, rd, th) */
  private static final String dayOfMonthPattern = "[0-3]?[0-9]" + spacers + "*(?:(?:th)|(?:st)|(?:nd)|(?:rd))?";

  /** matches months (numeric and text) */
  private static final String monthPattern = "(?:(?:Jan(?:uary)?)|(?:Feb(?:uary)?)|(?:Mar(?:ch)?)|(?:Apr(?:il)?)|(?:May)|(?:Jun(?:e)?)|(?:Jul(?:y)?)" +
                                              "|(?:Aug(?:ust)?)|(?:Sep(?:tember)?)|(?:Oct(?:ober)?)|(?:Nov(?:ember)?)|(?:Dec(?:ember)?)|(?:[0-1]?[0-9]))";

  /** matches years (only 1000's and 2000's, because we are matching emails) */
  private static final String yearPattern  = "(?:[1-2]?[0-9])[0-9][0-9]";

  /** matches a full date */
  private static final String datePattern     = "(?:" + dayPattern + spacers + "+)?(?:(?:" + dayOfMonthPattern + spacers + "+" + monthPattern + ")|" +
                                                "(?:" + monthPattern + spacers + "+" + dayOfMonthPattern + "))" +
                                                 spacers + "+" + yearPattern;

  /** matches a date and time combo (in either order) */
  private static final String dateTimePattern = "(?:" + datePattern + "[\\s,]*(?:(?:at)|(?:@))?\\s*" + timePattern + ")|" +
                                                "(?:" + timePattern + "[\\s,]*(?:on)?\\s*"+ datePattern + ")";

  /** matches a leading line such as
   * ----Original Message----
   * or simply
   * ------------------------
   */
  private static final String leadInLine    = "-+\\s*(?:Original(?:\\sMessage)?)?\\s*-+\n";

  /** matches a header line indicating the date */
  private static final String dateLine    = "(?:(?:date)|(?:sent)|(?:time)):\\s*"+ dateTimePattern + ".*\n";

  /** matches a subject or address line */
  private static final String subjectOrAddressLine    = "((?:from)|(?:subject)|(?:b?cc)|(?:to))|:.*\n";

  /** matches gmail style quoted text beginning, i.e.
   * On Mon Jun 7, 2010 at 8:50 PM, Simon wrote:
   */
  private static final String gmailQuotedTextBeginning = "(On\\s+" + dateTimePattern + ".*wrote:\n)";


  /** matches the start of a quoted section of an email */
  private static final Pattern QUOTED_TEXT_BEGINNING = Pattern.compile("(?i)(?:(?:" + leadInLine + ")?" +
                                                                        "(?:(?:" +subjectOrAddressLine + ")|(?:" + dateLine + ")){2,6})|(?:" +
                                                                        gmailQuotedTextBeginning + ")"
                                                                      );

Я знаю, что в некотором смысле это перебор ( и может быть медленным!), но работает очень хорошо. Пожалуйста, дайте мне знать, если вы найдете что-то, что не соответствует этому, чтобы я мог это улучшить!

12
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

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