Erfassen einer Instanz einer Regex-Suche

295
Justin Jarrett

Ich versuche, Regex zu verwenden, um zwischen dem Start des Berichts und dem Beginn des nächsten Berichts weiter unten in derselben Datei zu suchen, den Bericht als Ganzes zu erfassen und dann nach Duplikaten zu suchen und sie zu entfernen.

Sie werden von CRLFs getrennt, und ich dachte, es wäre klug (\r\n).*(\r\n), Berichte zu erfassen, zu suchen, zu löschen und für den nächsten Bericht zu wiederholen.

Wenn ich dies tue (\r\n).*(\r\n), wird von der nächsten CRLF bis zur letzten CRLF in der Datei erfasst.

Ich kann nicht für mich herausfinden, wie ich die Suche auf nur eine Instanz der ersten Zeile des Berichts beschränken kann, die ~ 30 Zeilen des Körpers, dann das Ende des Berichts.

0
Ihr Problem ist, dass der Punkt mit der neuen Zeile übereinstimmt. Deaktivieren Sie das Kontrollkästchen "Punkt trifft auf Zeilenumbruch" zu. Was in Notepad ++ nicht schwer zu finden ist .. barlop vor 7 Jahren 0
Bitte [bearbeiten] und fügen Sie einige Beispieldaten hinzu, wenn Sie eine bestimmte Antwort wünschen. DavidPostill vor 7 Jahren 1
@DavidPostill Es ist möglich, dass sein Verständnis auf einer Ebene liegt, auf der er keine Frage stellen muss, die für seinen speziellen Fall zu spezifisch ist. Und Fragen, die sehr spezifisch für den Fall einer Person sind, sind für andere oft weniger hilfreich. Es sieht so aus, als ob er das Problem selbst gelöst hat und gerade mit dem Punkt übereinstimmt, der mit der neuen Zeile übereinstimmt. So könnte er daran vorbeikommen und wenn er immer noch Probleme hat, könnte er eine andere Frage stellen und er würde auf diese Weise besser lernen. Ich würde ihn nicht ermutigen, das zu tun. barlop vor 7 Jahren 0

1 Antwort auf die Frage

1
barlop

Ihr Problem ist, dass der Punkt mit der neuen Zeile übereinstimmt. Deaktivieren Sie das Kontrollkästchen "Punkt trifft auf Zeilenumbruch" zu. Die in Notepad ++ möglicherweise nicht schwer zu finden sind (siehe die untere linke Ecke des Edit..find-Dialogfelds von Notepad ++). Ich füge kein Bild hinzu, weil Sie Notepad ++ nicht in Ihren Titel aufgenommen haben, und ich denke, es ist gut, wenn die Antwort nicht zu notepad ++ centric und unnötig notepad ++ centric aussieht. Andere Programme, die reguläre Ausdrücke unterstützen, haben auch einen Punkt, der mit Zeilenumbrüchen übereinstimmt, die aktiviert oder deaktiviert werden können.

Sie könnten mit anderen Suchvorgängen experimentieren und sehen, ob sie funktionieren oder nicht. Einige funktionieren unabhängig von Punkt, z. B. wenn sie keinen Punkt verwenden, oder ob sie Punkte verwenden können, aber z. B. .*?einen Operator, *? also nicht passt nicht zu viel. Andere Beispiele für reguläre Ausdrücke setzen voraus, dass der Punkt mit der neuen Zeile nicht markiert ist. Also kann es genauso gut abhacken, und nur ankreuzen, um zu sehen, ob und ob überhaupt ein Kontrast. Sie können dies versuchen, ^.*$wenn die neue Zeile nicht mit einem Punkt markiert ist. Oder deine mit dem Haken. Oder sehen Sie, was mit einer Art Muster der Form [^ X] * X passiert (das ist ein guter Weg, um das Problem zu vermeiden, zB wenn Sie das tun. * X, dann enthält * ein x und Sie nicht Wenn Sie möchten, können Sie alles angeben, was nicht x, * ist, gefolgt von x), \r\n[^\r\n]*\r\n oder etwa [^\r\n]*\r\ntry^[^\r\n]*\r\n Beachten Sie, dass die Einfügemarke in eckigen Klammern nicht bedeutet. Die ^ äußeren eckigen Klammern bedeuten die Übereinstimmungsposition am Zeilenanfang. Eine andere Möglichkeit besteht darin, *?gezielt zu versuchen, .*? z. \r\n.*?\r\n .*?B. möglichst wenige Punkte zu finden. Also .*?Xwerden bis X einige wenige Zeichen wie möglich passen.

Vielen Dank Barlop! Das Argument [^ \ r \ n]. *? \ R \ n war genau das, was ich brauche. Die Erklärung von was '.' und '?' hat wirklich geholfen. Justin Jarrett vor 7 Jahren 0
@JustinJarrett Was Sie vorgeschlagen haben, ist eine Art hybrider Ansatz, nicht gerade eines meiner Beispiele. Die Logik hinter meinen Beispielen ist etwas klarer als die Logik hinter Ihrem, aber wenn es funktioniert, dann funktioniert es. barlop vor 7 Jahren 0