Welcher Regex würde alles von der Marke bis zum Ende einer Zeile erfassen?

121

Ich habe eine Textdatei, die Bemerkungen mit einer einzigen bezeichnet '.

Einige Zeilen haben zwei Anführungszeichen, aber ich muss alles von der ersten Instanz von a 'und dem Zeilenvorschub erhalten.

I AL01                  ' A-LINE                            '091398 GDK 33394178    
         402922 0831850 '                                   '091398 GDK 33394179    
I AL02                  ' A-LINE                            '091398 GDK 33394180    
         400722 0833118 '                                   '091398 GDK 33394181    
I A10A                  ' A-LINE 102                       '  53198 DJ  33394182    
         395335 0832203 '                                  '  53198 DJ  33394183    
I A10B                  ' A-LINE 102                       '  53198 DJ  3339418
user38349
quelle

Antworten:

169
'.*

Ich glaube, Sie brauchen die Option, Multiline.

Joshua Belden
quelle
3
Dies erfasst die erste Instanz des Charakters und das Ende der letzten Zeile
killdaclick
90

Der geeignete reguläre Ausdruck wäre das Zeichen, gefolgt von einer beliebigen Anzahl von Zeichen [einschließlich Nullzeichen], die mit einem Ende des Zeichenfolgen- / Zeilentokens enden:

'.*$

Und wenn Sie alles nach dem Zeichen erfassen , aber nicht in die Ausgabe aufnehmen möchten, würden Sie Folgendes verwenden:

(?<=').*$

Dies bedeutet im Grunde, gib mir alle Zeichen, die dem Zeichen bis zum Ende der Zeile folgen.

Bearbeiten : Es wurde festgestellt, dass $ bei der Verwendung von. * Implizit ist und daher nicht unbedingt erforderlich ist, daher das Muster:

'.* 

ist technisch korrekt, es ist jedoch klarer, spezifisch zu sein und Verwirrung bei der späteren Code-Wartung zu vermeiden, daher meine Verwendung des $. Ich bin der Meinung, dass es immer besser ist, explizites Verhalten zu deklarieren, als sich auf implizites Verhalten in Situationen zu verlassen, in denen Klarheit in Frage gestellt werden könnte.

BenAlabaster
quelle
1
Das $ ist unnötig. Der Punkt stoppt unter normalen Umständen am Ende der Zeile.
Tomalak
7
unnötig - aber passend für das, was er tun will. Es dient als Erinnerung später, dass es alles von 'bis zum Ende der Linie erwartet
Gnarf
@balabaster: Ich habe nicht gesagt, dass es falsch war. ;-) Es war nur eine Fußnote.
Tomalak
@Tomalak: Ich habe nicht versucht zu implizieren, dass Sie in irgendeiner Weise falsch lagen, sondern nur meine Argumentation für meine Entscheidung geklärt, $ zu verwenden, anstatt nicht. Vielen Dank für den Hinweis.
BenAlabaster
+1 für das Einfügen, wie alles nach dem betreffenden Charakter eingefügt werden soll, anstatt es immer einzuschließen.
Grizzasd
22
'.*$

Beginnen Sie mit einem einfachen Anführungszeichen ( ') und stimmen Sie jedes Zeichen ( .) null oder mehrmals ( *) bis zum Ende der Zeile ( $) ab.

Gene Gotimer
quelle
Diese Antwort ist ein großartiges Beispiel dafür, wie man die Logik hinter einem Befehl aufschlüsselt, nett und klar!
Timmah
12

Wenn ich '. * In Windows (Notepad ++) versuchte, stimmte alles nach dem ersten' bis zum Ende der letzten Zeile überein.

Um alles bis zum Ende dieser Zeile zu erfassen, habe ich Folgendes eingegeben:

'.*?\n

Dies würde nur alles von 'bis zum Ende dieser Zeile erfassen.

dänisch
quelle
5

In Ihrem Beispiel würde ich das folgende Muster wählen:

'([^\n]+)$

Verwenden Sie mehrzeilige und globale Optionen, um alle Vorkommen abzugleichen.

Um den Zeilenvorschub in das Match aufzunehmen, können Sie Folgendes verwenden:

'[^\n]+\n

Dies könnte jedoch die letzte Zeile verfehlen, wenn kein Zeilenvorschub vorhanden ist.

Wenn Sie für eine einzelne Zeile nicht mit dem Zeilenvorschub übereinstimmen müssen, würde ich lieber Folgendes verwenden:

'[^$]+$
Gess
quelle
4

Dies erfasst alles bis zu 'in Rückreferenz 1 - und alles nach' in Rückreferenz 2. Je nach Sprache (\ ') müssen Sie möglicherweise den Apostrophen entkommen.

/^([^']*)'?(.*)$/

Schnelle Änderung: Wenn die Zeile keine '- Rückreferenz 1 hat, sollte immer noch die gesamte Zeile erfasst werden.

^ - start of string
([^']*) - capture any number of not ' characters
'? - match the ' 0 or 1 time
(.*) - capture any number of characters
$ - end of string
Zwerg
quelle
0

https://regex101.com/r/Jjc2xR/1

/(\w*\(Hex\): w*)(.*?)(?= |$)/gm

Ich bin mir sicher, dass dies funktioniert. Es wird de hexa serial im schlecht strukturierten Text mit mehreren Zeilen erfassen

     Space Reservation: disabled
         Serial Number: wCVt1]IlvQWv
   Serial Number (Hex): 77435674315d496c76515776
               Comment: new comment

Ich bin ein ewiger Neuling in Regex, aber ich werde versuchen, dies zu erklären

(\ w * (Hex): w *): Suchen Sie den Text in der Zeile, in der die Zeichenfolge "Hex:" enthält.

(. *?) Dies ist der zweite erfasste Text und bedeutet alles danach

(? = | $) erstellt eine Grenze, die der Abstand zwischen = und | ist

Mit der zweiten Gruppe haben Sie also den Wert

Xavius ​​Pupuss
quelle
Das ist nicht die Frage, oder?
Daniel E.