Java文字列がすべての空白文字ではないことを確認するにはどうすればよいですか?


132

Javaを使用して、Java文字列または文字配列が空白文字だけで構成されていないことを確認したいですか?

これはJavaScriptであることを除いて、非常によく似た質問です。
文字列に空白だけでなく文字と空白が含まれているかどうかを確認するにはどうすればよいですか?

編集:私は英数字についてのビットを削除したので、それはより理にかなっています。


3
ホワイトスペースにはさまざまな定義があることに注意してください。spreadsheets.google.com/ pub ?key = pd8dAQyHbdewRsnE5x5GzKQ どれが必要ですか。または、「英数字があります」と言うと、まったく別物です。どうか明らかにしてください。
Kevin Bourrillion、2010

混乱をお詫びします。すべての空白が重要なわけではありません。基本的に、すべての空白文字に空白文字が含まれている場合、除外したいのですが、コンテンツがないためです。
Ankur

1
JDK / 11 では、同じためにAPIを利用String.isBlankできます。
ナマン

回答:


224

私が考えることができる最も短い解決策:

if (string.trim().length() > 0) ...

これは、(非)空白のみをチェックします。特定の文字クラスをチェックする場合は、次のmatch()ような正規表現でマイティを使用する必要があります。

if (string.matches(".*\\w.*")) ...

...少なくとも1つの(ASCII)英数字をチェックします。


9
FWIW:最初のソリューションはかなり高速になると思います。
スティーブンC

2
@Stephen C:もちろんです!@Uriが指摘したようにしかし、私は質問のあいまいさへの2つの異なる問題のおかげで解決することだ:)また、私はめったに使わないmatches():パフォーマンスのために、私は通常、保管Patternfinal static。同じコードが頻繁に実行される場合は報われます。
Carl Smotricz、2010

3
@Andreas_D:へー、私は私の注文を得た!OPは文字列または文字配列をチェックしたいと言ったが、nullについては何も言わなかった!:) *契約の細字をチェックします* " nullは文字列ではありません!"
Carl Smotricz、2010

1
また、「\\ w」は、AZ、az、0-9、およびアンダースコアとして定義される「単語文字」を参照するため、すべての非空白文字ではなく、非空白文字の限られたサブセットにのみ一致します。
Rob Raisch、

2
your_string.trim()。isEmpty()を使用して、私のために仕事をしました
Neri

59

Apache Commons Langライブラリを使用します。これには、あらゆる種類の文字列操作に役立つStringUtilsというクラスがあります。文字列がすべての空白文字ではないかどうかを確認するには、以下を使用できます。

StringUtils.isBlank(<your string>)

ここに参照があります:StringUtils.isBlank


8
選択した回答を使用するよりも、このソリューションを優先します。これは文字列== nullもチェックします
Richard

これは正しくありません。StringUtils.isEmpty""を渡すとfalseが返されるようになりました。
ジェームススペンス2017年

53

Carl Smotriczが言及したものより少し短い:

!string.trim().isEmpty();

10
あなたは若いwhiippersnappersとあなたの新しくできたポストJava-1.6の策略です!真剣に、私の会社の少なくとも1つのプロジェクトがJava 1.4(ため息)でまだ実行されています。
Carl Smotricz、2011

もっと短い?はい。個人的に、私はより冗長なコーディングスタイルが好きです
Michel


9

Java 11を使用している場合は、新しいisBlank文字列メソッドが便利です。

!s.isBlank();

Java 8、9、または10を使用している場合、単純なストリームを作成して、文字列が空白文字だけではないことを確認できます。

!s.chars().allMatch(Character::isWhitespace));

Apache Commons Langなどのサードパーティライブラリを必要としないことに加えて、これらのソリューションには、他の多くの回答で提案されて' 'いるtrimベースのソリューションのようなプレーンスペースだけでなく、空白文字を処理できるという利点があります。サポートされているすべての空白タイプの完全なリストについては、Javadocを参照してください。空の文字列も両方のケースでカバーされることに注意してください。


5
if(target.matches("\\S")) 
    // then string contains at least one non-whitespace character

「非空白文字」を意味するバックスラッシュキャップSの使用に注意してください。

これが最も簡単な(そしておそらく最速の?)解決策です。


2
試してみましょう: String year="1995"; year.matches("\\S"); will return falseこれは正しい解決策ではありません。:|
Nhat Dinh

6
つまり、理由を説明するのに途方に暮れていますが、あなたは正しいです。Javaドキュメントによると、String.matchesは、指定された文字列が正規表現に一致するかどうかを確認します。提供された正規表現がENTIRE文字列と一致する場合にのみこの関数が一致するように見えるため、少し実験を行うと、これは完全に正確ではないことがわかります。したがって、上記の正規表現( "\\ S")を "^。* \\ S。* $"に変更すると期待どおりに動作しますが、この動作は正しく文書化されておらず、文字列マッチングの他のすべての実装とは大きく異なるようです正規表現を使用します。
Rob Raisch

4

この回答では、「少なくとも1つの英数字が含まれている」という副注に重点を置いています。その上、文字列がの場合にNPEで害を及ぼさないことを除いて、他の(以前の)ソリューションにあまり多くを追加しませんnull

我々はしたいfalse(1)sがある場合nullまたは(2)の空であるか、(3)Sのみwhitecharsが含まれています。

public static boolean containsNonWhitespaceChar(String s) {
  return !((s == null) || "".equals(s.trim()));
}

4

空白のみをチェックし、nullを気にしない場合は、org.apache.commons.lang.StringUtils.isWhitespace(String str)を使用できます。

StringUtils.isWhitespace(String str);

(文字列に空白のみが含まれているかどうかを確認します。)

null(空白を含む)もチェックする場合は、

StringUtils.isBlank(String str);

isBlank(String)はnull検証も処理するため、推奨されています!
Sachidananda Naik

2

Java-11以降では、String.isBlankAPIを使用して、指定された文字列がすべて空白で構成されていないかどうかを確認できます-

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

1

トリム方法はあなたのためにうまくいくはずです。

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かどうかを確認したりできます。


答えのリンクは死んでいる-404 | このページは存在しないか、利用できなくなりました
パン

0

代替:

boolean isWhiteSpaces( String s ) {
    return s != null && s.matches("\\s+");
 }

1
\\ s *は、空白の有無に関係なくすべての文字列に一致します。たぶん\\ s +ですか?
Rob

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) を使用する必要があります。


0
StringUtils.isEmptyOrWhitespaceOnly(<your string>)

チェックします:-それはnullですか-それはスペースのみですか-空の文字列 ""ですか?

https://www.programcreek.com/java-api-examples/?class=com.mysql.jdbc.StringUtils&method=isEmptyOrWhitespaceOnly


1
これは図書館からですか?プロジェクトにリンクします。またはJavaに組み込まれていますか?パッケージを示します。
バジルブルク2018

@BasilBourqueこれはcom.mysql.jdbc.StringUtils.isEmptyOrWhitespaceOnly
ahmet_y

0

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ループで、空白以外の単一の文字を探しています...

編集: テキストが長いほど、数値が異なります。長いテキストのトリミングは、単純なループよりも時間がかかります。ただし、正規表現は依然として最も遅いソリューションです。


0

個人的には!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" };
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.