2016-04-23 3 views
-3

Ich habe versucht, eine Zeichenfolge zu finden und den gesamten Text nach der Übereinstimmung auszugeben.Kann Perl Regex nur mit begrenztem Text umgehen?

zB: Ich versuche, alles nach dem Wort „Hallo“

drucken
$string = "hello its a good day" 

output: its a good day. 

der folgende Code sehr effizient gearbeitet hat:

my ($extract) = $string =~ /hello\s*(.+)$/; 

Das Problem kommt, wenn ich eine große Menge verwenden versuchen, Text, wie wenn die Zeichenkette eine Datei mit Hunderten von Wörtern ist (wie ein pragraph mit mehreren Zeilen) und ich den Text nur nach einem bestimmten Wort wie oben verwenden möchte. Es reagiert überhaupt nicht.

Beispiel

Dear sally, how is your day, I heard things are getting better 
etc etc 

how is everyone 

sometimes. not alwyas etc etc etc etc 

kind regards 

So dann will ich alles nach "Lieb sally" erfassen.

würde der Ausgang sein:

, how is your day, I heard things are getting better 
etc etc 

how is everyone 

sometimes. not alwyas etc etc etc etc 

kind regards 

Ich versuchte stattdessen den geteilten Befehl zu verwenden, aber es nur Ausgänge Zahlen.

+1

Können Sie ein minimales aber vollständiges Programm zeigen, das das Problem zeigt? –

Antwort

0

"Es reagiert überhaupt nicht" ist nicht sehr klar. Ein Punkt . in einem Regex-Muster entspricht normalerweise einem beliebigen Zeichen außer einem Zeilenumbruch.

Wahrscheinlich sind Ihre Eingabedaten über mehrere Zeilen verteilt?

Sie können das /s Modifikator Punkt ändern, alles zu passen überhaupt, aber unter diesen Umständen ein Muster wie /hello\s*(.+)$/s wird der Datei der gesamte Rest passen nach hello

Sie sollten erklären, was Sie‘ re versuchen zu erreichen; dann könnten wir Sie können versuchen, folgenden Ansatz besser

-1

helfen:

my $output; 

while (my $line = <$fh>) 
{ 
    if ($output) 
    { 
     $output .= $line; 
     next; 
    } 

    if ($line =~ /hello\s*(.+)/) 
    { 
     $output = $1; 
    } 
} 

ich es auf einer 150k + line Textdatei getestet habe und es fertig in weniger als eine Sekunde.

Grundlegende Logik hier ist, dass wir alle Zeilen in einer Datei unter $fh Dateihandle gehen und nach einer Übereinstimmung suchen. Wenn eine Übereinstimmung in einer Zeile gefunden wird, speichern wir den übereinstimmenden Teil einer Zeile in der Variablen $output. Für nachfolgende Zeilen führen wir keine Übereinstimmung durch, sondern verketten sie in die Variable $output.

Nachdem alle Zeilen verarbeitet wurden, enthält die Variable $output die Zeile, die mit unserer Suchzeichenfolge und allen folgenden Zeilen übereinstimmt.

+1

Sie sollten wirklich erklären, was Ihr Code tatsächlich tut. Das OP ist bei weitem nicht klar darüber, was sie wollen, und es ist normalerweise keine große Hilfe, wenn man ohne zu fragen rät. Auch erwähnte niemand Antwortzeiten und deshalb sind sie irrelevant. Ein sehr gewöhnliches Festplattenlaufwerk liest 100MB in einer Sekunde, wenn die Daten also nicht massiv sind (das OP sagte "Hunderte von Wörtern", also ungefähr 10KB Maximum), ist die Lesezeit unbedeutend – Borodin

+0

@Borodin, ich habe eine kurze Erklärung hinzugefügt – bart