2009-05-06 17 views
60

Mam plik tekstowy, który oznacza uwagi z pojedynczym '.Co Regex przechwyci wszystko od "znacznika do końca linii?

Niektóre wiersze mają dwie cytaty, ale muszę uzyskać wszystko od pierwszego wystąpienia ' i linii.

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 

Odpowiedz

68
'.* 

Uważam, że potrzebna jest opcja Multiline.

61

Odpowiedni regex byłby 'char następnie dowolną ilość dowolnych znaków [włącznie zera znaków] kończąc końca łańcuch/linia Token:

'.*$ 

A jeśli chciał uchwycić wszystko po do "char ale nie umieścić go na wyjściu, należy użyć:

(?<=').*$ 

To w zasadzie mówi mi dać wszystkie znaki, które FO rzuć "char" aż do końca linii.

Edit. Stwierdzono, że $ jest niejawny przy użyciu *, a zatem nie jest to bezwzględnie konieczne, zatem wzór:

'.* 

jest technicznie poprawne, jednakże jest wyraźniejszy za szczególne i uniknąć zamieszanie w celu późniejszego utrzymania kodu, stąd moje użycie znaku $. Uważam, że zawsze lepiej jest deklarować zachowanie jawne niż polegać na ukrytym zachowaniu w sytuacjach, w których jasność może być kwestionowana.

+1

$ jest niepotrzebna. Kropka zatrzyma się na końcu linii w normalnych warunkach. – Tomalak

+7

niepotrzebne - ale właściwe dla tego, co chce zrobić. Przypomina to później, że oczekuje wszystkiego od "do końca linii" – gnarf

+0

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

15
'.*$ 

Począwszy pojedynczy cudzysłów ('), dowolny znak (.) zero lub więcej razy (*) aż do końca linii ($).

+0

Podoba mi się twoje zwięzłe wyjaśnienie. Dzięki! – EdwardM

2

To uchwycić wszystko, aż do „w odwołaniem wstecznym 1 - a wszystko po” w odwołaniem wstecznym 2. Być może trzeba uciec apostrof choć w zależności od języka (\ ')

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

Szybkie zmiany: jeśli linia nie ma "- wsteczna referencja 1 powinna nadal wychwycić 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 
4

Kiedy próbowałem „* w Windows (Notepad ++) byłoby dopasować wszystko po pierwszym” do końca ostatniej linii.

Aby uchwycić wszystko aż do końca tej linii Wpisałem następujące:

'.*?\n 

byłoby to uchwycić wszystko z tylko "aż do końca tej linii.

2

W przykładzie pójdę do poniższego wzoru:

'([^\n]+)$ 

użycie multiline i globalne opcje, aby dopasować wszystkie wystąpienia.

Aby dołączyć wysuw w tym meczu mógł użyć:

'[^\n]+\n 

Ale to może przegapić ostatni wiersz, jeśli nie ma wysuw.

Dla jednej linii, jeśli nie trzeba dopasować wysuw wolałbym używać:

'[^$]+$ 
Powiązane problemy