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

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


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).


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*$

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.


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 „/ ^ $ /”.


-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


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
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.