Tutaj puste oznacza to, co masz na myśli. Linia zawiera dużo białych znaków lub linia nie zawiera niczego. Jeśli chcesz dopasować linię, która nic nie zawiera, użyj '/ ^ $ /'
Badri Gs
Odpowiedzi:
329
Wzór, który chcesz, wygląda mniej więcej tak w trybie wielowierszowym:
^\s*$
Wyjaśnienie:
^ jest początkiem kotwicy struny.
$ jest końcem kotwicy struny.
\s jest klasą białych znaków.
* to zero lub więcej powtórzeń.
W trybie wielowierszowym, ^a $także dopasuj początek i koniec wiersza.
Możesz również sprawdzić, czy dany ciąg linejest „pusty” (tj. Zawiera tylko białe spacje), wykonując trim()go, a następnie sprawdzając, czy otrzymany ciąg isEmpty().
W Javie wyglądałoby to mniej więcej tak:
if(line.trim().isEmpty()){// line is "blank"}
Rozwiązanie regex można również uprościć bez kotwic (ze względu na sposób matcheszdefiniowania w Javie) w następujący sposób:
@Adnan: zwróć uwagę na komentarz Barta w odpowiedzi Marcelo; w zależności od tego, jak chcesz obsłużyć wiele pustych linii, wzór może się nieznacznie zmienić.
polygenelubricants
Cóż, czytam plik z Javy, wiersz po wierszu, więc zakładam, że będzie dobrze.
Adnan
1
to wydaje się genialne z line.trim: D
Adnan,
1
Doskonale, kody teraz wykonuje się od 1,6 sekundy do> 1 sekundy Dziękuję.
Adnan
w pythonie: if line.strip(): ponieważ pusty łańcuch ma wartośćFalse
John Mark
58
Właściwie w trybie wielowierszowym bardziej poprawna odpowiedź brzmi:
/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Zaakceptowana odpowiedź: ^\s*$nie pasuje do scenariusza, gdy ostatnia linia jest pusta (w trybie wielowierszowym).
Dokładnie, i potwierdziłem, że tak jest. Zaakceptowana odpowiedź pominęła wiele pustych wierszy w moim pliku, ale to złapało je wszystkie. Połączenie obu wyrażeń regularnych obejmuje każdy przypadek.
elmor
1
Ta odpowiedź działała doskonale w narzędziu takim jak Notepad ++. Zaakceptowana odpowiedź pasowała do wielu pustych wierszy, ale nie do pojedynczych pustych wierszy.
James
W moim przypadku zaakceptowana odpowiedź nie działa w Sublime Text 3 i to działa.
yangsibai,
1
Zaakceptowana odpowiedź zadziałała w moim przypadku, multilinii. To robi.
@Adnan, zwróć uwagę, że \sdopasowuje również podziały wierszy, więc nie „znajdziesz” pojedynczych pustych wierszy w ciągu zawierającym kolejne puste wiersze.
Bart Kiers
6
Najbardziej przenośne regex byłoby ^[ \t\n]*$dopasować pusty ciąg (zauważ, że będzie trzeba wymienić \ti \nprzy karcie i nowa linia Odpowiednio) i [^ \n\t]pasujące ciąg bez spacji.
Przynajmniej zmieniłbym pojedynczą przestrzeń z klasą [ \t]
Bart Kiers
1
W systemie Windows należy również wziąć pod uwagę znak powrotu karetki, \rwięc będzie to wyrażenie regularne ^[ \t\r\n]*$. Ale ^\s*$jest lepiej - bardziej zwięźle. Jeśli nie chcesz dopasowywać nowych linii, możesz użyć \h(czyli poziomych białych znaków) jak w^\h*$
ps.pf
5
Pełne uznanie dla bchr02 za tę odpowiedź . Musiałem jednak trochę zmodyfikować, aby złapać scenariusz dla wierszy, które mają */(koniec komentarza), po którym następuje pusta linia. Wyrażenie regularne pasowało do niepustej linii z */.
Nowy: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Wszystko, co zrobiłem, to dodać ^jako drugi znak, aby oznaczyć początek wiersza.
Dlaczego nie skomentować odpowiedzi bchr02 i nie zasugerować ulepszenia jego odpowiedzi?
adamlogan
1
@adamlogan tak, z pamięci, myślę, że chciałem to zrobić w tamtym czasie, ale nie miałem wystarczającej reputacji, aby komentować czyjeś posty, więc musiałem to zrobić w ten sposób.
John Henry
3
Tutaj puste oznacza to, co masz na myśli.
Linia zawiera dużo białych znaków lub linia nie zawiera niczego.
Jeśli chcesz dopasować wiersz, który nic nie zawiera, użyj „/ ^ $ /”.
Cóż ... majstrowałem (używając notepadd ++) i to jest rozwiązanie, które znalazłem
\ n \ s
\ n dla końca linii (gdzie zaczynasz dopasowywanie) - daszek nie byłby pomocny w moim przypadku, ponieważ początek wiersza jest łańcuchem \ s zajmuje dowolną przestrzeń do następnego ciągu
OP chce otrzymać odpowiedź wyrażenia regularnego, która została podana i nie dotyczy znaków nowego wiersza.
Moody_Mudskipper
użytkownik prosi o „proste wyrażenie regularne, które sprawdzi, czy linia jest pusta” to wyrażenie regularne (testowane w witrynie regexpal.com) robi dokładnie to samo. dlaczego tego nie testujesz?
tak jak powiedziałem, użyłem tego w Notatniku ++ i zadziałało. twój nie. więc myślę, że możemy zgodzić się nie zgodzić!
M_TRONIC,
Nie jestem jednak pewien, co robisz, czy robisz ctrl+fw notatniku ++? W tym przypadku możesz znaleźć (choć nie do końca pasują) puste wiersze, wybierając tryb wyszukiwania „Rozszerzony” i wyszukując „\ n \ s”. Jeśli wybierzesz „Wyrażenie regularne”, ciąg będzie pasował do tego samego i możesz wypróbuj również rozwiązanie @polygenelubricants. To ostatnie będzie naprawdę pasowało do linii, możesz sprawdzić i zobaczyć różnicę. Sugeruję, aby edytować swoją odpowiedź, aby była bardziej jasna, co radzisz, aby czytelnicy mogli wyciągnąć więcej korzyści z it.
Odpowiedzi:
Wzór, który chcesz, wygląda mniej więcej tak w trybie wielowierszowym:
Wyjaśnienie:
^
jest początkiem kotwicy struny.$
jest końcem kotwicy struny.\s
jest klasą białych znaków.*
to zero lub więcej powtórzeń.W trybie wielowierszowym,
^
a$
także dopasuj początek i koniec wiersza.Bibliografia:
Alternatywa inna niż wyrażenia regularne:
Możesz również sprawdzić, czy dany ciąg
line
jest „pusty” (tj. Zawiera tylko białe spacje), wykonująctrim()
go, a następnie sprawdzając, czy otrzymany ciągisEmpty()
.W Javie wyglądałoby to mniej więcej tak:
Rozwiązanie regex można również uprościć bez kotwic (ze względu na sposób
matches
zdefiniowania w Javie) w następujący sposób:Dokumentacja API
String String.trim()
boolean String.isEmpty()
true
jeśli i tylko wtedy, gdylength()
jest0
.boolean String.matches(String regex)
źródło
if line.strip():
ponieważ pusty łańcuch ma wartośćFalse
Właściwie w trybie wielowierszowym bardziej poprawna odpowiedź brzmi:
Zaakceptowana odpowiedź:
^\s*$
nie pasuje do scenariusza, gdy ostatnia linia jest pusta (w trybie wielowierszowym).źródło
Spróbuj tego:
źródło
\s
dopasowuje również podziały wierszy, więc nie „znajdziesz” pojedynczych pustych wierszy w ciągu zawierającym kolejne puste wiersze.Najbardziej przenośne regex byłoby
^[ \t\n]*$
dopasować pusty ciąg (zauważ, że będzie trzeba wymienić\t
i\n
przy karcie i nowa linia Odpowiednio) i[^ \n\t]
pasujące ciąg bez spacji.źródło
[ \t]
\r
więc będzie to wyrażenie regularne^[ \t\r\n]*$
. Ale^\s*$
jest lepiej - bardziej zwięźle. Jeśli nie chcesz dopasowywać nowych linii, możesz użyć\h
(czyli poziomych białych znaków) jak w^\h*$
Pełne uznanie dla bchr02 za tę odpowiedź . Musiałem jednak trochę zmodyfikować, aby złapać scenariusz dla wierszy, które mają
*/
(koniec komentarza), po którym następuje pusta linia. Wyrażenie regularne pasowało do niepustej linii z*/
.Nowy:
(^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Wszystko, co zrobiłem, to dodać
^
jako drugi znak, aby oznaczyć początek wiersza.źródło
Tutaj puste oznacza to, co masz na myśli.
Linia zawiera dużo białych znaków lub linia nie zawiera niczego.
Jeśli chcesz dopasować wiersz, który nic nie zawiera, użyj „/ ^ $ /”.
źródło
Cóż ... majstrowałem (używając notepadd ++) i to jest rozwiązanie, które znalazłem
\ n \ s
\ n dla końca linii (gdzie zaczynasz dopasowywanie) - daszek nie byłby pomocny w moim przypadku, ponieważ początek wiersza jest łańcuchem \ s zajmuje dowolną przestrzeń do następnego ciągu
mam nadzieję, że to pomoże
źródło
test_vec <- c(" some"," ","")
. rozwiązanie:grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE
The głosowało rozwiązanie:grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE
. przegłosowane rozwiązanie daje oczekiwany rezultat, a twoje nie.ctrl+f
w notatniku ++? W tym przypadku możesz znaleźć (choć nie do końca pasują) puste wiersze, wybierając tryb wyszukiwania „Rozszerzony” i wyszukując „\ n \ s”. Jeśli wybierzesz „Wyrażenie regularne”, ciąg będzie pasował do tego samego i możesz wypróbuj również rozwiązanie @polygenelubricants. To ostatnie będzie naprawdę pasowało do linii, możesz sprawdzić i zobaczyć różnicę. Sugeruję, aby edytować swoją odpowiedź, aby była bardziej jasna, co radzisz, aby czytelnicy mogli wyciągnąć więcej korzyści z it.