Dies ist nicht eine gute Verwendung für Regex, wenn Sie versuchen, alles in einem Muster zu tun. Es ist möglich zu tun, aber ich vermute, dass das Universum abkühlen wird, bevor Sie alle Fehler beseitigen.
Um den Umfang dessen, was Sie versuchen zu verstehen, lesen Sie Wikipedia's article on "Posting Style". Es gibt viele verschiedene Möglichkeiten, wie Antworten in eine E-Mail-Nachricht eingebettet werden, die teilweise vom MUA (E-Mail-Benutzer-Agent) und teilweise von der antwortenden Person kontrolliert wird. Es gibt keine festgelegte Methode für die Zuweisung und keine Regel, die besagt, dass sich die Antwort in einem Block auf der Seite oder oben auf der Seite befindet. Dies bedeutet, dass jeder Code, den Sie schreiben, sehr ausgefeilt sein muss, um die Chance zu haben, konsistent zu arbeiten.
Haben Sie sich Mail
angesehen? Es ist bereits geschrieben, es ist gut getestet, es hat alle möglichen coolen Schnickschnack, und es ist bereits geschrieben. (Ich sagte es noch einmal, weil neu erfassende Räder, die gut funktionieren, wirklich schmerzhaft sein können.)
Das Parsen von Nur-Text-E-Mail ist eine Aufgabe. Dann gibt es MIME-kodierte E-Mails mit unterschiedlichen Inhaltstypen. Dann gibt es "HTML" -E-Mails, die keine MIME-Blöcke haben, sondern stattdessen ein paar Idioten, die sich vorstellen, dass jeder HTML-Formatierung und blinkenden Text mag. Dann gibt es verschiedene merkwürdig zerbrochene Arten von Nachrichtentexten mit vier Antworttypen und den vollständigen Inhalt aller vorherigen Nachrichten, die unterhalb der nächsten angehängt sind, und die Unterschriften der schrecklich frustrierten Möchtegern-Schreiber, die den gesamten Text meines Lieblingsbuchs enthalten. " Girl to Grab ", AKA Vol. 5 der Enzyklopädie Britannica. Mail
kann helfen, den ganzen Müll für Sie auszubrechen, Ihnen einen guten Schuss auf den Inhalt zu geben, den Sie brauchen.
Um eine Reihe von Text in einem Körper zu greifen, schauen Sie sich Rubys ..
(AKA "Flip-Flop") -Operator an. Es wurde entwickelt, um ein Boolesches Wahr/Falsch zurückzugeben, wenn zwei verschiedene Tests auftreten. Siehe „When would a Ruby flip-flop be useful?“
Normalerweise würde bauen Sie es mögen:
if ((string =~ /pattern1/) .. (string =~ /pattern2/))
...
end
Als Verarbeitung auftritt, wenn der erste Test passt etwas dann nachfolgende Schleifen wird in den if
Block fallen. Wenn der Endungstest gefunden wird, wird der Block für nachfolgende Schleifen ausgeschaltet. In diesem Fall möchten Sie entweder ein Zeichenfolgenliteral oder einen kleinen Regex verwenden, um Ihre Start- und Endzeilen zu finden. Wenn Sie das Startmuster im späteren Text sehen können, müssen Sie herausfinden, wie Sie das fangen können.
Zum Beispiel, hier ist ein Weg, um einige Inhalte zu ergreifen, die Ihre angegebenen Anforderungen gerecht zu werden scheinen, wenn jemand hat eine Top-Antwort:
msg = <<EOT
The Message is here, etc etc can span a random # of lines
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
On Nov 17, 2010, at 4:18 PM, Person Name wrote:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
EOT
body = []
msg.lines.each do |li|
li.chomp!
body << li
break if (li =~ /^On (\S+)*\w+ \d+, \d+, at [\d:]+ \w+, .+ wrote:/i)
end
puts body[0 .. -2]
puts '=' * 40
msg = <<EOT
The Message is here, etc etc can span a random # of lines
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
On Nov 17, 2010, at 4:18 PM, Site <[email protected]> wrote:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
EOT
body = []
msg.lines.each do |li|
li.chomp!
body << li
break if (li =~ /^On (\S+)*\w+ \d+, \d+, at [\d:]+ \w+, .+ wrote:/i)
end
puts body[0 .. -2]
Und hier ist der Ausgang:
# >> The Message is here, etc etc can span a random # of lines
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
# >>
# >> ========================================
# >> The Message is here, etc etc can span a random # of lines
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
# >>
Die Muster könnte einfacher sein, aber wenn es war, würde es die Chance erhöhen, falsch-positive zurückzugehen.
"Ist das möglich?" Ja. Hast du es schon probiert? – meagar
sollte wahrscheinlich erwähnt haben. Ich benutze Rails 3. also ist eine Rubin Methode ideal. – AnApprentice
@meagar, das ist großartig. Ich war mir nicht einmal sicher! Ich bin ein Neuling, vielleicht kannst du ein paar Tipps geben, also habe ich eine Startrichtung? Ich bin noch nie so fertig. Ich habe vor einem Monat Ruby auf Schienen gelernt. – AnApprentice