Chcę sprawdzić, czy ciąg znaków Java lub tablica znaków nie składa się tylko z białych znaków, używając języka Java?
To jest bardzo podobne pytanie, poza tym, że jest to JavaScript:
Jak mogę sprawdzić, czy ciąg zawiera znaki i spacje, a nie tylko białe spacje?
EDYCJA : usunąłem trochę o znakach alfanumerycznych, więc ma to więcej sensu.
java
string
whitespace
Ankur
źródło
źródło
String.isBlank
API do tego samego.Odpowiedzi:
Najkrótsze rozwiązanie, jakie przychodzi mi do głowy:
if (string.trim().length() > 0) ...
To sprawdza tylko (nie) białe znaki. Jeśli chcesz sprawdzić określone klasy postaci, musisz użyć funkcji potężnej
match()
z wyrażeniem regularnym, takim jak:if (string.matches(".*\\w.*")) ...
... który sprawdza co najmniej jeden (ASCII) znak alfanumeryczny.
źródło
matches()
: do wykonania zwykle przechowujęPattern
plik w formaciefinal static
. Opłaca się, jeśli ten sam kod jest często uruchamiany.null
nie jest ciągiem!"Użyłbym biblioteki Apache Commons Lang. Ma klasę o nazwie StringUtils, która jest przydatna dla wszystkich rodzajów operacji na łańcuchach. Aby sprawdzić, czy ciąg to nie wszystkie białe spacje, możesz użyć następującego:
Oto odniesienie: StringUtils.isBlank
źródło
StringUtils.isEmpty
zwróci teraz false, jeśli przekażesz „”.Nieco krótszy niż to, o czym wspomniał Carl Smotricz:
źródło
https://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/StringUtils.html#isBlank-java.lang.CharSequence-
źródło
Jeśli używasz języka Java 11 ,
isBlank
przyda się nowa metoda ciągów:Jeśli używasz języka Java 8, 9 lub 10 , możesz zbudować prosty strumień, aby sprawdzić, czy ciąg nie jest tylko białymi znakami:
Oprócz tego, że nie wymagają żadnych bibliotek innych firm, takich jak Apache Commons Lang, rozwiązania te mają tę zaletę, że obsługują dowolny znak odstępu, a nie tylko zwykłe
' '
spacje, jaktrim
sugerowałoby to rozwiązanie oparte na a w wielu innych odpowiedziach. Pełną listę wszystkich obsługiwanych typów białych znaków można znaleźć w dokumentacji Javadocs . Zwróć uwagę, że puste ciągi są również objęte w obu przypadkach.źródło
if(target.matches("\\S")) // then string contains at least one non-whitespace character
Zwróć uwagę na użycie odwrotnego ukośnika cap-S, co oznacza „znak inny niż biały znak”
Założę się, że jest to najprostsze (i być może najszybsze?) Rozwiązanie.
źródło
String year="1995"; year.matches("\\S"); will return false
więc to nie jest poprawne rozwiązanie. : |Ta odpowiedź skupia się bardziej na uwadze bocznej „ tj. Ma co najmniej jeden znak alfanumeryczny ”. Poza tym nie dodaje zbyt wiele do innego (wcześniejszego) rozwiązania, z wyjątkiem tego, że nie szkodzi ci z NPE w przypadku, gdy String jest
null
.Chcemy,
false
jeśli (1) s jestnull
lub (2) s jest puste lub (3) s zawiera tylko białe znaki.public static boolean containsNonWhitespaceChar(String s) { return !((s == null) || "".equals(s.trim())); }
źródło
Jeśli sprawdzasz tylko białe znaki i nie przejmujesz się wartością null, możesz użyć org.apache.commons.lang.StringUtils.isWhitespace (String str),
StringUtils.isWhitespace(String str);
(Sprawdza, czy ciąg zawiera tylko białe znaki).
Jeśli chcesz również sprawdzić, czy nie ma wartości null (w tym spacji), to
źródło
W Javie-11 + możesz skorzystać z
String.isBlank
API, aby sprawdzić, czy dany ciąg nie składa się w całości z białych znaków -String str1 = " "; System.out.println(str1.isBlank()); // made up of all whitespaces, prints true String str2 = " a"; System.out.println(str2.isBlank()); // prints false
Javadoc dla tego samego to:
/** * Returns {@code true} if the string is empty or contains only * {@link Character#isWhitespace(int) white space} codepoints, * otherwise {@code false}. * * @return {@code true} if the string is empty or contains only * {@link Character#isWhitespace(int) white space} codepoints, * otherwise {@code false} * * @since 11 */ public boolean isBlank()
źródło
Metoda przycinania powinna działać świetnie.
http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim ()
Możesz przyciąć, a następnie porównać z pustym ciągiem lub sprawdzić długość na 0.
źródło
Tylko porównanie wydajności na openjdk 13, Windows 10. Dla każdego z tych tekstów:
"abcd" " " " \r\n\t" " ab " " \n\n\r\t \n\r\t\t\t \r\n\r\n\r\t \t\t\t\r\n\n" "lorem ipsum dolor sit amet consectetur adipisici elit" "1234657891234567891324569871234567891326987132654798"
wykonał jeden z następujących testów:
// trim + empty input.trim().isEmpty() // simple match input.matches("\\S") // match with precompiled pattern final Pattern PATTERN = Pattern.compile("\\S"); PATTERN.matcher(input).matches() // java 11's isBlank input.isBlank()
każdy 10.000.000 razy.
Wyniki:
METHOD min max note trim: 18 313 much slower if text not trimmed match: 1799 2010 pattern: 571 662 isBlank: 60 338 faster the earlier hits the first non-whitespace character
Dość zaskakujące jest, że trym + pusty jest najszybszy. Nawet jeśli musi utworzyć przycięty tekst. Jeszcze szybsza niż prosta pętla for szukająca pojedynczego znaku bez spacji ...
EDYCJA: Im dłuższy tekst, tym więcej liczb się różni. Przycinanie długiego tekstu zajmuje więcej czasu niż zwykła pętla. Jednak wyrażenia regularne są nadal najwolniejszym rozwiązaniem.
źródło
Alternatywny:
boolean isWhiteSpaces( String s ) { return s != null && s.matches("\\s+"); }
źródło
trim () i inne wymienione wyrażenia regularne nie działają dla wszystkich typów białych znaków
tj .: znak Unicode „LINE SEPARATOR” http://www.fileformat.info/info/unicode/char/2028/index.htm
Funkcje języka Java Character.isWhitespace () obejmują wszystkie sytuacje.
Dlatego należy zastosować wspomniane już rozwiązanie StringUtils.isWhitespace (String) / lub StringUtils.isBlank (String) .
źródło
sprawdzi: - czy to null - czy to tylko spacja - czy to pusty ciąg ""
https://www.programcreek.com/java-api-examples/?class=com.mysql.jdbc.StringUtils&method=isEmptyOrWhitespaceOnly
źródło
Chociaż osobiście wolałbym
!str.isBlank()
, jak sugerowali inni (lubstr -> !str.isBlank()
jako predykat), bardziej nowoczesna i wydajna wersja powyższegostr.trim()
podejścia używałabystr.strip()
- traktując null jako „białe spacje”:if (str != null && str.strip().length() > 0) {...}
Na przykład jako predykat, do użytku ze strumieniami, np. W teście jednostkowym:
@Test public void anyNonEmptyStrippedTest() { String[] strings = null; Predicate<String> isNonEmptyStripped = str -> str != null && str.strip().length() > 0; assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).noneMatch(isNonEmptyStripped)).orElse(true)); strings = new String[] { null, "", " ", "\\n", "\\t", "\\r" }; assertTrue(Optional.ofNullable(strings).map(arr -> Stream.of(arr).anyMatch(isNonEmptyStripped)).orElse(true)); strings = new String[] { null, "", " ", "\\n", "\\t", "\\r", "test" }; }
źródło