Javaを使用して、Java文字列または文字配列が空白文字だけで構成されていないことを確認したいですか?
これはJavaScriptであることを除いて、非常によく似た質問です。
文字列に空白だけでなく文字と空白が含まれているかどうかを確認するにはどうすればよいですか?
編集:私は英数字についてのビットを削除したので、それはより理にかなっています。
String.isBlank
できます。
Javaを使用して、Java文字列または文字配列が空白文字だけで構成されていないことを確認したいですか?
これはJavaScriptであることを除いて、非常によく似た質問です。
文字列に空白だけでなく文字と空白が含まれているかどうかを確認するにはどうすればよいですか?
編集:私は英数字についてのビットを削除したので、それはより理にかなっています。
String.isBlank
できます。
回答:
私が考えることができる最も短い解決策:
if (string.trim().length() > 0) ...
これは、(非)空白のみをチェックします。特定の文字クラスをチェックする場合は、次のmatch()
ような正規表現でマイティを使用する必要があります。
if (string.matches(".*\\w.*")) ...
...少なくとも1つの(ASCII)英数字をチェックします。
matches()
:パフォーマンスのために、私は通常、保管Pattern
にfinal static
。同じコードが頻繁に実行される場合は報われます。
null
は文字列ではありません!"
Apache Commons Langライブラリを使用します。これには、あらゆる種類の文字列操作に役立つStringUtilsというクラスがあります。文字列がすべての空白文字ではないかどうかを確認するには、以下を使用できます。
StringUtils.isBlank(<your string>)
ここに参照があります:StringUtils.isBlank
StringUtils.isEmpty
""を渡すとfalseが返されるようになりました。
Carl Smotriczが言及したものより少し短い:
!string.trim().isEmpty();
Java 11を使用している場合は、新しいisBlank
文字列メソッドが便利です。
!s.isBlank();
Java 8、9、または10を使用している場合、単純なストリームを作成して、文字列が空白文字だけではないことを確認できます。
!s.chars().allMatch(Character::isWhitespace));
Apache Commons Langなどのサードパーティライブラリを必要としないことに加えて、これらのソリューションには、他の多くの回答で提案されて' '
いるtrim
ベースのソリューションのようなプレーンスペースだけでなく、空白文字を処理できるという利点があります。サポートされているすべての空白タイプの完全なリストについては、Javadocを参照してください。空の文字列も両方のケースでカバーされることに注意してください。
if(target.matches("\\S"))
// then string contains at least one non-whitespace character
「非空白文字」を意味するバックスラッシュキャップSの使用に注意してください。
これが最も簡単な(そしておそらく最速の?)解決策です。
String year="1995"; year.matches("\\S"); will return false
これは正しい解決策ではありません。:|
空白のみをチェックし、nullを気にしない場合は、org.apache.commons.lang.StringUtils.isWhitespace(String str)を使用できます。
StringUtils.isWhitespace(String str);
(文字列に空白のみが含まれているかどうかを確認します。)
null(空白を含む)もチェックする場合は、
StringUtils.isBlank(String str);
Java-11以降では、String.isBlank
APIを使用して、指定された文字列がすべて空白で構成されていないかどうかを確認できます-
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は次のとおりです。
/**
* 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()
トリム方法はあなたのためにうまくいくはずです。
http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/lang/String.html#trim()
文字列のコピーを返します。先頭と末尾の空白は省略されています。このStringオブジェクトが空の文字シーケンスを表す場合、またはこのStringオブジェクトによって表される文字シーケンスの最初と最後の文字の両方に '\ u0020'(スペース文字)より大きいコードがある場合、このStringオブジェクトへの参照が返されます。
それ以外の場合、文字列に '\ u0020'より大きいコードの文字がない場合は、空の文字列を表す新しいStringオブジェクトが作成されて返されます。
それ以外の場合、kをコードが '\ u0020'より大きい文字列の最初の文字のインデックスとし、mをコードが '\ u0020'より大きい文字列の最後の文字のインデックスとします。新しい文字列オブジェクトが作成され、インデックスkの文字で始まり、インデックスmの文字で終わるこの文字列の部分文字列を表します。つまり、this.substring(k、m + 1)の結果です。
このメソッドは、文字列の最初と最後から空白を削除するために使用できます。実際、すべてのASCII制御文字もトリミングします。
戻り値:先頭と末尾の空白を削除したこの文字列のコピー。先頭または末尾に空白がない場合はこの文字列。先頭または末尾の空白。
トリミングしてから空の文字列と比較したり、長さが0かどうかを確認したりできます。
trim()および他の言及された正規表現は、すべてのタイプの空白に対して機能しません
例:Unicode文字「LINE SEPARATOR」 http://www.fileformat.info/info/unicode/char/2028/index.htm
Java関数Character.isWhitespace()はすべての状況をカバーします。
そのため、既に言及したソリューション StringUtils.isWhitespace(String) / or StringUtils.isBlank(String) を使用する必要があります。
StringUtils.isEmptyOrWhitespaceOnly(<your string>)
チェックします:-それはnullですか-それはスペースのみですか-空の文字列 ""ですか?
openjdk 13、Windows 10でのパフォーマンス比較です。これらの各テキストについて:
"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"
次のいずれかのテストを実行しました:
// 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()
各10.000.000回。
結果:
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
驚くべきことに、trim + emptyが最速です。トリミングされたテキストを作成する必要がある場合でも。さらに高速で単純なforループで、空白以外の単一の文字を探しています...
編集: テキストが長いほど、数値が異なります。長いテキストのトリミングは、単純なループよりも時間がかかります。ただし、正規表現は依然として最も遅いソリューションです。
個人的には!str.isBlank()
、他の人がすでに提案しているように(またはstr -> !str.isBlank()
述語として)を推奨しますが、str.trim()
上記のアプローチのより近代的で効率的なバージョンは、nullを「空白」str.strip()
と見なして使用します。
if (str != null && str.strip().length() > 0) {...}
たとえば、プレディケートとして、たとえば単体テストでストリームで使用するには、次のようにします。
@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" };
}