文字列を文字列の配列に分割


112

文字列を単一の文字列の配列に分割する必要があります。

たとえば、「cat」を分割すると、配列「c」、「a」、「t」が得られます



3
クイックリファレンスとして、 ""。join(["c"、 "a"、 "t"])を使用して「cat」を取得します。
shuva 2017


Java 8:.split("")やります。
Amr Lotfy 2018

回答:


120
"cat".split("(?!^)")

これは

配列["c"、 "a"、 "t"]


8
方法と理由?これは任意の文字を意味する正規表現ですか?私の考えでは、splitが機能する方法では、これは実際の文字(、?、!、^、および)でのみ分割されるはずです。しかし、あなたが言うとおりに機能します。
Ty_ 2014年

3
これは確かに、否定先読みと呼ばれる正規表現です。チェックアウトここドキュメント:docs.oracle.com/javase/6/docs/api/java/util/regex/...
アーウィン

4
@ EW-CodeMonkey (?!... )は否定的なアサーションの正規表現構文です。これは、内部に何も一致しないことをアサートします。そして^、文字列の先頭に一致するため、正規表現は文字列の先頭ではないすべての位置で一致し、そこに分割を挿入します。この正規表現は文字列の最後でも一致するため、String.splitドキュメントに「末尾の空の文字列は結果の配列に含まれない」と書かれている場合を除き、結果に空の文字列が追加されます。
Boann 2015年

8
Java 8では、の動作String.splitがわずかに変更され、ゼロ幅の一致によって生成された先行する空の文字列も結果の配列に含まれないため(?!^)、位置が文字列の先頭ではないというアサーションが不要になり、正規表現で何も単純化しない– "cat".split("")–しかし、Java 7以前では、結果の配列に先行する空の文字列を生成します。
Boann 2015年

1
文字列全体の配列を作成します。
エデュアルド

109
"cat".toCharArray()

しかし、文字列が必要な場合

"cat".split("")

編集:空の最初の値を返します。


12
"cat" .split( "")は[、c、a、t]を返しますが、違いますか?アレイに追加のキャラクターが登場します...
リーフマー

4
"cat" .split( "")はMattの期待どおりに機能せず、余分な空の文字列=> [、c、a、t]を取得します。
リーフ

5
この答えは、Java 8を使用している場合に機能します
Alexis Cを

4
これはjdk8での恐ろしい変更でした。これは、split( "")に依存していて、この愚かな空の最初のインデックスの原因を回避するためです。java8にアップグレードした後は、何年も前に期待したとおりに機能します。残念ながら、私の回避策は私のコードを壊します... ggrrrr。
Marc

@Marc .toCharArray()とにかく使用する必要があります。正規表現を回避し、charプリミティブの配列を返すため、高速で軽量です。1文字の文字列の配列が必要なのは奇妙です。
Boann 2015年

41
String str = "cat";
char[] cArray = str.toCharArray();

3
ちなみに、元の質問はCharの配列ではなく、Stringの配列を要求します。ただし、ここから文字列の配列を取得するのは非常に簡単です。
dsolimano

ええ、私はすでに文字の配列を取得する方法を知っています。他に方法がない場合は、char配列を反復処理して、それぞれから文字列を作成できます。
Matt

どのように変換しcArray直しStringますか?
ビットマップ'27年

正しい構文は次のようになります。char[] cArray = str.ToCharArray();
dbz

6

Basic Multilingual Planeを超える文字(一部のCJK文字、新しい絵文字など)が入力で予想さ"a💫b".split("(?!^)")れる場合、そのような文字が壊れる(結果はarray ["a", "?", "?", "b"])ため、などのアプローチは使用できず、より安全なものを使用する必要があります。

"a💫b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

2

文字列を1文字の文字列の配列に変換する効率的な方法は、次のようにすることです。

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

ただし、これはcharStringが実際にUnicodeコードポイントの半分を表すことができる。(コードポイントがBMPにない場合。)これに対処するには、コードポイントを反復処理する必要があります...より複雑です。

このアプローチは、を使用String.split(/* clever regex*/)するよりも高速で、Java 8+ストリームを使用するよりもおそらく高速です。これはおそらくこれより速くなります:

String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

文字を新しい配列toCharArrayコピーする必要があるためです。


2

他の答えを要約すると...

これはすべてのJavaバージョンで機能します。

"cat".split("(?!^)")

これはJava 8以降でのみ機能します。

"cat".split("")

0

多分あなたは、文字列コンテンツを通過するforループを使用し、charAtメソッドを使用して文字ごとに文字を抽出することができます。

ArrayList<String>たとえばと組み合わせると、個々の文字の配列を取得できます。


多分あなたは片足で立って「女神を救え」を歌うことができるでしょう。申し訳ありませんが、これは正しいとは言えません。
スティーブンC

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
これで文字列が配列に分割されますか?文字列を画面に出力しているだけです。
TDG 2016年

0

元の文字列が含まれている場合、補助Unicode文字を、そしてsplit()それがサロゲートペアにこれらの文字を分割して、動作しないでしょう。これらの特殊文字を正しく処理するには、次のようなコードが機能します。

String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
    int cp = stringToSplit.codePointAt(i);
    char c[] = Character.toChars(cp);
    chars[j] = new String(c);
    i += Character.charCount(cp);
}

0

split("(?!^)")文字列にサロゲートペアが含まれている場合、正しく動作しません。使用する必要がありますsplit("(?<=.)")

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

出力:

[花, a, b, 🌹, 🌺, 🌷]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.