Próbuję utworzyć proste wyrażenie regularne, które sprawdzi, czy linia jest pusta, czy nie.
Walizka;
" some" // not blank
" " //blank
"" // blank
Próbuję utworzyć proste wyrażenie regularne, które sprawdzi, czy linia jest pusta, czy nie.
Walizka;
" some" // not blank
" " //blank
"" // blank
Odpowiedzi:
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 line
jest „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 matches
zdefiniowania w Javie) w następujący sposób:
if (line.matches("\\s*")) {
// line is "blank"
}
String String.trim()
boolean String.isEmpty()
true
jeśli i tylko wtedy, gdy length()
jest 0
.boolean String.matches(String regex)
if line.strip():
ponieważ pusty łańcuch ma wartośćFalse
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).
Spróbuj tego:
^\s*$
\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.
[ \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.
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
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.