Mam takie dane
john, dave, chris
rick, sam, bob
joe, milt, paul
Używam tego wyrażenia regularnego, aby dopasować nazwy
/(\w.+?)(\r\n|\n|,)/
która działa w większości przypadków, ale końce plików nagle po ostatnim słowo oznaczające ostatnią wartość nie kończy się \r\n
, \n
albo ,
kończy się EOF. Czy istnieje sposób na dopasowanie EOF w wyrażeniu regularnym, abym mógł to poprawnie umieścić w drugiej grupie?
Odpowiedzi:
Odpowiedź na to pytanie
\Z
zajęła mi trochę czasu, zanim to rozgryzłem, ale teraz działa. Zauważ, że odwrotnie,\A
mecze początkiem całego łańcucha znaków (w przeciwieństwie do^
i$
dopasowanie początek jednej linii).źródło
(\s*)\?>(\s*)\Z
... i po kilku dalszych kopiach tutaj jest to, co działałoby w folderze projektu :(\s*)\?>(\s*)(\n*)(\W)\Z
FYI: ma to na celu zastąpienie wszystkich zamykających tagów php znakami końca linii na końcu pliku.\A
działa również w programie Visual Studio znajdź i zamień. Jak zawsze używaj takich rzeczy ostrożnie, ale zaoszczędziło mi to mnóstwa ręcznego bałaganu, gdy byłem szczęśliwy, że faktycznie zrobi to dobrze.Scanner
klasy Javy do odczytu całego pliku naraz; jeśli\Z
użyję jako separatora, obcięty zostanie końcowy znak nowej linii. Kiedy zmieniłem separator na\z
, zachowywany jest końcowy znak nowej linii. Wydaje się, że odpowiedź Martina Doreya odnosi się również do Javy.EOF w rzeczywistości nie jest postacią. Jeśli masz ciąg wieloliniowy, „$” dopasuje koniec ciągu, jak i koniec linii.
W Perlu i jego braciach
\A
i\Z
dopasuj początek i koniec łańcucha, całkowicie ignorując znaki końca linii.Rozszerzenia GNU do wyrażeń regularnych POSIX używają
\`
i\'
do tego samego.źródło
W programie Visual Studio można znaleźć EOF tak:
$(?![\r\n])
. Działa to niezależnie od tego, czy zakończenia linii to CR, CRLF, czy tylko LF.Jako bonus możesz upewnić się, że wszystkie pliki z kodem mają końcowy znacznik nowej linii, taki jak:
Find What: (?<![\r\n])$(?![\r\n]) Replace With: \r\n Use Regular Expressions: checked Look at these file types: *.cs, *.cshtml, *.js
Jak to działa:
Znajdź dowolny koniec wiersza (dopasowanie o zerowej szerokości), który nie jest poprzedzony literami CR ani LF, a także nie występuje po nim CR ani LF. Pewna myśl pokaże Ci, dlaczego to działa!
Zauważ, że powinieneś Zastąpić żądanym znakiem końca linii, czy to CR, LF czy CRLF.
źródło
Porównaj zachowanie sugerowanego przez Ryana \ Z z \ z:
perlre sez:
Tłumaczenie przypadku testowego na Rubiego (1.8.7, 1.9.2) zachowuje się tak samo.
źródło
Czy naprawdę musisz przechwytywać separatory linii? Jeśli nie, to to wyrażenie regularne powinno wystarczyć:
/\w+/
Zakłada się, że wszystkie podciągi, które chcesz dopasować, składają się wyłącznie ze znaków słownych, jak w twoim przykładzie.
źródło
Może spróbuj $ (EOL / EOF) zamiast (\ r \ n | \ n)?
/\"(.+?)\".+?(\w.+?)$/
źródło
Ostatnio szukałem czegoś takiego, ale JavaScript.
Umieszczając to tutaj, aby każdy, kto ma ten sam problem, mógł skorzystać
var matchEndOfInput = /$(?![\r\n])/gm;
Zasadniczo pasowałoby to do końca wiersza, po którym nie następuje powrót karetki ani znaki nowego wiersza. W istocie jest to to samo, co
\Z
poza JavaScriptem.źródło
Zakładając, że używasz odpowiedniego modyfikatora wymuszającego traktowanie ciągu jako całości (nie linii po linii - i jeśli \ n działa, to używasz), po prostu dodaj inną alternatywę - koniec łańcucha: (\ r \ n | \ n |, | $)
źródło
/(\w.+?)(\r\n|\n|,|$)/
źródło