Javaで文字列を分割する方法

2010年08月14日に質問されました。  ·  閲覧回数 4M回  ·  ソース

riyana picture
2010年08月14日

2つの文字列に分割したい文字列"004-034556"あります。

string1="004";
string2="034556";

つまり、最初の文字列には'-'前の文字が含まれ、2番目の文字列には'-'後の文字が含まれます。 文字列に'-'れているかどうかも確認したいと思います。 そうでない場合は、例外をスローします。 これどうやってするの?

回答

BalusC picture
2010年08月14日
3052

適切な方法を使用してください: String#split()

String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556

これは正規表現を使用するため、必要に応じて特殊文字をエスケープすることを忘れないでください。

特別な意味を持つ12文字があります:バックスラッシュ\ 、大括弧^ 、ドル記号$ 、ピリオドまたはドット. 、垂直バーまたはパイプ記号| 、疑問符? 、アスタリスクまたは星* 、プラス記号+ 、開き括弧( 、閉じ括弧) 、および開き角かっこ[ 、開き中括弧{ 、これらの特殊文字は「メタ文字」と呼ばれることがよくあります。

したがって、たとえばピリオド/ドット.で分割する場合は、正規表現の「任意の文字」を意味します。バックスラッシュ\を使用して、 split("\\.")ように個々の特殊文字をエスケープします。 、または文字クラス[]を使用してsplit("[.]")ようにリテラル文字を表すか、 Pattern#quote()を使用してsplit(Pattern.quote("."))ように文字列全体をエスケープします。

String[] parts = string.split(Pattern.quote(".")); // Split on period.

文字列に特定の文字が含まれているかどうかを事前にテストするには、 String#contains()ます。

if (string.contains("-")) {
    // Split it.
} else {
    throw new IllegalArgumentException("String " + string + " does not contain -");
}

これは正規表現をとらないことに注意してください。 そのためには、代わりにString#matches()使用してください。

結果のパーツで分割文字を保持したい場合は、ポジティブルックアラウンドを利用してください。 分割文字を左側に配置する場合は、パターンの前に?<=グループを付けて、ポジティブルックビハインドを使用します。

String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556

分割文字を右側に配置する場合は、パターンの前に?=グループを付けて、ポジティブルックアヘッドを使用します。

String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556

結果のパーツの数を制限したい場合は、 split()メソッドの2番目の引数として目的の数を指定できます。

String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42
Rob Hague picture
2010年08月14日
81

文字列を直接処理する代わりに、キャプチャグループで正規表現を使用することもできます。 これには、入力に対してより高度な制約を簡単に暗示できるという利点があります。 たとえば、次の例では、文字列を2つの部分に分割し、両方が数字のみで構成されていることを確認します。

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class SplitExample
{
    private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");

    public static void checkString(String s)
    {
        Matcher m = twopart.matcher(s);
        if (m.matches()) {
            System.out.println(s + " matches; first part is " + m.group(1) +
                               ", second part is " + m.group(2) + ".");
        } else {
            System.out.println(s + " does not match.");
        }
    }

    public static void main(String[] args) {
        checkString("123-4567");
        checkString("foo-bar");
        checkString("123-");
        checkString("-4567");
        checkString("123-4567-890");
    }
}

この場合、パターンは固定されているため、事前にコンパイルして静的メンバーとして保存できます(この例ではクラスのロード時に初期化されます)。 正規表現は次のとおりです。

(\d+)-(\d+)

括弧はキャプチャグループを示します。 示されているように、正規表現のその部分に一致する文字列には、Match.group()メソッドからアクセスできます。 \ dは一致し、小数点以下1桁で、+は「前の式の1つ以上に一致する」を意味します。-は特別な意味を持たないため、入力内のその文字に一致するだけです。円記号は二重エスケープする必要があることに注意してください。これをJava文字列として記述する場合。その他の例:

([A-Z]+)-([A-Z]+)          // Each part consists of only capital letters 
([^-]+)-([^-]+)            // Each part consists of characters other than -
([A-Z]{2})-(\d+)           // The first part is exactly two capital letters,
                           // the second consists of digits
jjnguy picture
2010年08月14日
43

使用する:

String[] result = yourString.split("-");
if (result.length != 2) 
     throw new IllegalArgumentException("String not in correct format");

これにより、文字列が2つの部分に分割されます。 配列の最初の要素は-前のものを含む部分になり、配列の2番目の要素は-後の文字列の部分を含みます。

配列の長さが2でない場合、文字列はstring-string形式ではありません

Stringクラスのsplit()メソッドを確認してください。

secmask picture
2010年08月14日
30
String[] out = string.split("-");

あなたがしたいことをする必要があります。 文字列クラスには、文字列を操作するための多くのメソッドがあります。

Mnyikka picture
2012年11月16日
30
// This leaves the regexes issue out of question
// But we must remember that each character in the Delimiter String is treated
// like a single delimiter        

public static String[] SplitUsingTokenizer(String subject, String delimiters) {
   StringTokenizer strTkn = new StringTokenizer(subject, delimiters);
   ArrayList<String> arrLis = new ArrayList<String>(subject.length());

   while(strTkn.hasMoreTokens())
      arrLis.add(strTkn.nextToken());

   return arrLis.toArray(new String[0]);
}
Somaiah Kumbera picture
2016年12月01日
25

Java 8の場合:

    List<String> stringList = Pattern.compile("-")
            .splitAsStream("004-034556")
            .collect(Collectors.toList());

    stringList.forEach(s -> System.out.println(s));
Michael Konietzka picture
2010年08月14日
19

要件は解釈の余地を残しました。 メソッドを書くことをお勧めします、

public final static String[] mySplit(final String s)

この関数をカプセル化します。 もちろん、実装の他の回答で述べられているように、String.split(..)を使用できます。

入力文字列と目的の結果および動作について、いくつかの単体テストを作成する必要があります。

適切なテスト候補には、次のものが含まれます。

 - "0022-3333"
 - "-"
 - "5555-"
 - "-333"
 - "3344-"
 - "--"
 - ""
 - "553535"
 - "333-333-33"
 - "222--222"
 - "222--"
 - "--4555"

それに応じたテスト結果を定義することで、動作を指定できます。

たとえば、 "-333"[,333]返される場合、またはエラーの場合です。 "333-333-33"[333,333-33] or [333-333,33]で区切ることはできますか、それともエラーですか? 等々。

SHUNMUGA RAJ PRABAKARAN picture
2013年01月15日
17

あなたもこのように試すことができます

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");
eis picture
2014年03月25日
16

仮定して

  • 分割に正規表現は本当に必要ありません
  • あなたはすでにあなたのアプリでapachecommonslangを使用しています

最も簡単な方法は、 StringUtils#split(java.lang.String、char)を使用することです。 正規表現が必要ない場合は、Javaがすぐに提供するものよりも便利です。 そのマニュアルが言うように、それはこのように機能します:

A null input String returns null.

 StringUtils.split(null, *)         = null
 StringUtils.split("", *)           = []
 StringUtils.split("a.b.c", '.')    = ["a", "b", "c"]
 StringUtils.split("a..b.c", '.')   = ["a", "b", "c"]
 StringUtils.split("a:b:c", '.')    = ["a:b:c"]
 StringUtils.split("a b c", ' ')    = ["a", "b", "c"]

通常、使用可能なものがたくさん含まれているため、commong-langの使用をお勧めします。 ただし、分割を行う以外の目的でそれが必要ない場合は、自分で実装するか、正規表現をエスケープすることをお勧めします。

sandeep vanama picture
2014年07月01日
16

分割する文字または文字列に基づいて文字列を分割できるorg.apache.commons.lang.StringUtilsのsplitメソッドを使用します。

メソッドシグネチャ:

public static String[] split(String str, char separatorChar);

あなたの場合、「-」があるときに文字列を分割したいとします。

次のように簡単に行うことができます。

String str = "004-034556";

String split[] = StringUtils.split(str,"-");

出力:

004
034556

-が文字列に存在しない場合、指定された文字列が返され、例外は発生しないと想定します。