Który Regex uchwyciłby wszystko od „znaku do końca wiersza?


122

Mam plik tekstowy oznaczający uwagi pojedynczym '.

Niektóre wiersze mają dwa cudzysłowy, ale muszę pobrać wszystko z pierwszego wystąpienia a 'i nowego wiersza.

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

Odpowiedzi:



90

Odpowiednim wyrażeniem regularnym byłoby „znak, po którym następuje dowolna liczba dowolnych znaków [w tym zero znaków], kończących się znacznikiem końca łańcucha / linii:

'.*$

A jeśli chcesz uchwycić wszystko po znaku „char, ale nie uwzględniać go w danych wyjściowych, użyj:

(?<=').*$

Zasadniczo oznacza to, że podaj mi wszystkie znaki następujące po znaku „do końca wiersza.

Edycja : zauważono, że $ jest niejawne podczas używania. * I dlatego nie jest ściśle wymagane, dlatego wzorzec:

'.* 

jest technicznie poprawny, jednak jaśniej jest być konkretnym i unikać nieporozumień przy późniejszej konserwacji kodu, stąd też używam $. Uważam, że zawsze lepiej jest deklarować jawne zachowanie niż polegać na zachowaniu ukrytym w sytuacjach, w których można kwestionować jasność.


1
Znak $ jest niepotrzebny. W normalnych okolicznościach kropka zatrzyma się na końcu linii.
Tomalak

7
niepotrzebne - ale odpowiednie do tego, co chce robić. Służy później jako przypomnienie, że spodziewa się wszystkiego od 'do końca linii
gnarf

@balabaster: Nie powiedziałem, że to źle. ;-) To był tylko przypis.
Tomalak

@Tomalak: Nie próbowałem sugerować, że w jakikolwiek sposób się mylisz, po prostu wyjaśniałem moje uzasadnienie wyboru użycia $ zamiast nie. Dziękuję za zwrócenie uwagi.
BenAlabaster

+1 za dołączanie wszystkiego po danej postaci, zamiast zawsze ją dołączać.
grizzasd

22
'.*$

Rozpoczynając od pojedynczego cudzysłowu ( '), dopasuj dowolny znak ( .) zero lub więcej razy ( *) aż do końca wiersza ( $).


Ta odpowiedź jest doskonałym przykładem tego, jak przełamać logikę stojącą za poleceniem, ładnym i jasnym!
Timmah

12

Kiedy próbowałem '. * W Windows (Notepad ++), pasowałoby wszystko po pierwszym' do końca ostatniej linii.

Aby uchwycić wszystko do końca tej linii, wpisałem:

'.*?\n

To uchwyciłoby tylko wszystko od „do końca tej linii”.


6

W twoim przykładzie wybrałbym następujący wzór:

'([^\n]+)$

użyj opcji wielowierszowych i globalnych, aby dopasować wszystkie wystąpienia.

Aby dołączyć wysuw linii do dopasowania, możesz użyć:

'[^\n]+\n

Ale może to pominąć ostatnią linię, jeśli nie ma wysuwu.

W przypadku jednej linii, jeśli nie musisz dopasowywać wysuwu linii, wolałbym użyć:

'[^$]+$

4

Spowoduje to uchwycenie wszystkiego, aż do „w odwołaniu wstecznym 1 - i wszystko po” w odwołaniu wstecznym 2. Być może trzeba będzie uciec od apostrofów, choć w zależności od języka (\ ”)

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

Szybka modyfikacja: jeśli linia nie ma '- referencji wstecznej 1, powinna nadal przechwytywać całą linię.

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

0

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

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

Jestem pewien, że ten działa, uchwyci serię de hexa w źle skonstruowanym tekście wielowierszowym poniżej

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

Jestem wiecznym nowicjuszem w regexie, ale spróbuję to wyjaśnić

(\ w * (Hex): w *): Znajdź tekst w wierszu, w którym ciąg zawiera „Hex:”

(. *?) To jest drugi przechwycony tekst i oznacza wszystko po nim

(? = | $) tworzy limit, który jest odstępem między = a |

Więc z drugą grupą będziesz miał wartość


To nie jest pytanie, prawda?
Daniel E.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.