Jak sprawdzić, czy linia jest pusta za pomocą wyrażenia regularnego

154

Próbuję utworzyć proste wyrażenie regularne, które sprawdzi, czy linia jest pusta, czy nie.

Walizka;

"    some"   // not blank
"   " //blank
"" // blank
Adnan
ź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ć 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.

Bibliografia:


Alternatywa inna niż wyrażenia regularne:

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:

if (line.matches("\\s*")) {
    // line is "blank"
}

Dokumentacja API

smary wielogenowe
źródło
1
@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).

bchr02
źródło
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.
Robert Gabriel
1
to powinna być najlepsza odpowiedź.
P i
12

Spróbuj tego:

^\s*$
Marcelo Cantos
źródło
5
@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.

soulmerge
źródło
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.

John Henry
źródło
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 „/ ^ $ /”.

kiruthika
źródło
-1

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

M_TRONIC
źródło
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?
M_TRONIC
używając R, nasz testowy wektor: test_vec <- c(" some"," ",""). rozwiązanie: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEThe głosowało rozwiązanie: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. przegłosowane rozwiązanie daje oczekiwany rezultat, a twoje nie.
Moody_Mudskipper
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.
Moody_Mudskipper