web-dev-qa-db-ja.com

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

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

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

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

1408
riyana

適切なメソッド 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() を使用します。

結果のパーツで分割文字を保持する場合は、 positive lookaround を使用します。分割文字を左側に配置したい場合は、パターンの?<=グループにプレフィックスを付けることにより、ポジティブな後読みを使用します。

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
2734
BalusC

文字列を直接処理する代わりに、キャプチャグループを含む正規表現を使用することもできます。これには、入力に対してより洗練された制約を暗示することを簡単にするという利点があります。たとえば、次のコードは文字列を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桁の10進数に一致し、+は「前の式の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
70
Rob Hague
String[] result = yourString.split("-");
if (result.length != 2) 
     throw new IllegalArgumentException("String not in correct format");

これはあなたの弦を2つの部分に分けます。配列の最初の要素は-の前のものを含む部分となり、配列の2番目の要素は-の後の文字列の部分となります。

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

Stringクラスのsplit()メソッドを調べてください。

https://docs.Oracle.com/javase/8/docs/api/Java/lang/String.html#split-Java.lang.String-int-

40
jjnguy
// 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]);
}
27
Mnyikka
String[] out = string.split("-");

あなたが望むことをするべきです。文字列クラスは文字列を操作するための多くのメソッドを持っています。 

24
secmask

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

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]で区切ることはできますか、それともエラーですか?等々。

18

Java 8の場合

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

    stringList.forEach(s -> System.out.println(s));
17
Somaiah Kumbera

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

-があなたの文字列の中に存在しない場合、それは与えられた文字列を返し、そしてあなたはいかなる例外も受けないでしょう。

15
sandeep vanama

仮定して

  • あなたは本当にあなたの分割のために正規表現を必要としません
  • あなたは、あなたのアプリで既にApache commons lang langを使用しています。

最も簡単な方法は 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を使うことをお勧めします、それは通常それが使えるものをたくさん含んでいるからです。しかし、分割をする以外にそれを必要としないのであれば、自分で実装するか正規表現をエスケープすることがより良い選択肢です。

15
eis

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

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");

文字列を正規表現を使って複数の文字に分割

public class StringSplitTest {
     public static void main(String args[]) {
        String s = " ;String; String; String; String, String; String;;String;String; String; String; ;String;String;String;String";
        //String[] strs = s.split("[,\\s\\;]");
        String[] strs = s.split("[,\\;]");
        System.out.println("Substrings length:"+strs.length);
        for (int i=0; i < strs.length; i++) {
            System.out.println("Str["+i+"]:"+strs[i]);
        }
     }
  }

出力:

Substrings length:17
Str[0]:
Str[1]:String
Str[2]: String
Str[3]: String
Str[4]: String
Str[5]: String
Str[6]: String
Str[7]:
Str[8]:String
Str[9]:String
Str[10]: String
Str[11]: String
Str[12]:
Str[13]:String
Str[14]:String
Str[15]:String
Str[16]:String

しかし、すべてのJDKバージョンで同じ出力が期待されるわけではありません。 1つのバグ これは、最初のnull文字列が無視されていたJDKのバージョンによっては発生します。このバグは最新のJDKバージョンには存在しませんが、JDK 1.7最新バージョンと1.8初期バージョンの間のいくつかのバージョンに存在します。

13
Ravindra babu

単純なユースケースでは String.split() が仕事をします。もしあなたがguavaを使うのであれば、 Splitter クラスもあります。これは異なる文字列操作の連鎖を可能にし、 CharMatcher をサポートします。

Splitter.on('-')
       .trimResults()
       .omitEmptyStrings()
       .split(string);
13
public class SplitTest {

    public static String[] split(String text, String delimiter) {
        Java.util.List<String> parts = new Java.util.ArrayList<String>();

        text += delimiter;

        for (int i = text.indexOf(delimiter), j=0; i != -1;) {
            String temp = text.substring(j,i);
            if(temp.trim().length() != 0) {
                parts.add(temp);
            }
            j = i + delimiter.length();
            i = text.indexOf(delimiter,j);
        }

        return parts.toArray(new String[0]);
    }


    public static void main(String[] args) {
        String str = "004-034556";
        String delimiter = "-";
        String result[] = split(str, delimiter);
        for(String s:result)
            System.out.println(s);
    }
}
10

最も少ないリソースを消費する最速の方法は、次のとおりです。

String s = "abc-def";
int p = s.indexOf('-');
if (p >= 0) {
    String left = s.substring(0, p);
    String right = s.substring(p + 1);
} else {
  // s does not contain '-'
}
10
David

次の文を使用して、文字列を改行で分割することができます。

String textStr[] = yourString.split("\\r?\\n");

次の文を使用して、文字列をハイフン/文字で区切ることができます。

String textStr[] = yourString.split("-");
9
import Java.io.*;

public class BreakString {

  public static void main(String args[]) {

    String string = "004-034556-1234-2341";
    String[] parts = string.split("-");

    for(int i=0;i<parts.length;i++) {
      System.out.println(parts[i]);
    }
  }
}
9
Ravi Pandey

要約すると、Javaでストリングを分割するには少なくとも5つの方法があります。

  1. String.split():

    String[] parts ="10,20".split(",");
    
  2. Pattern.compile(regexp).splitAsStream(入力):

    List<String> strings = Pattern.compile("\\|")
          .splitAsStream("010|020202")
          .collect(Collectors.toList());
    
  3. StringTokenizer(レガシークラス):

    StringTokenizer strings = new StringTokenizer("Welcome to EXPLAINJAVA.COM!", ".");
    while(strings.hasMoreTokens()){
        String substring = strings.nextToken();
        System.out.println(substring);
    }
    
  4. Google Guava Splitter:

    Iterable<String> result = Splitter.on(",").split("1,2,3,4");
    
  5. Apache CommonsのStringUtils:

    String[] strings = StringUtils.split("1,2,3,4", ",");
    

だからあなたはあなたが必要なものに応じてあなたのための最良の選択肢を選ぶことができます。戻り型(配​​列、リスト、または反復可能)。

ここ はこれらの方法の大まかな概要と最も一般的な例です(ドット、スラッシュ、疑問符などで分割する方法)。

8

StringTokenizer classは互換性のために残されている従来のクラスであるため使用しないでください。新しいコードでは使用しないでください。そして他の人が提案しているように分割法を利用することもできます。

String[] sampleTokens = "004-034556".split("-");
System.out.println(Arrays.toString(sampleTokens));

そして予想どおりそれは印刷されます:

[004, 034556]

この答えでは、 Java 8のsplitメソッドのために行われた1つの変更点 も指摘したいと思います。 String#split() メソッドはPattern.splitを利用するようになり、結果の配列の先頭にある空の文字列が削除されます。これに注意してください 変更 Java 8のためのドキュメンテーション:

入力シーケンスの先頭に正の幅の一致があると、結果の配列の先頭に空の先行サブストリングが含まれます。ただし、先頭に幅0の一致があっても、そのような空の先頭部分文字列は生成されません。

これは次の例では意味があります。

String[] sampleTokensAgain = "004".split("");
System.out.println(Arrays.toString(sampleTokensAgain));

java 7以前の場合のように4つではなく、[0, 0, 4]という3つの文字列を取得します。これと同じ question もチェックしてください。

7
i_am_zero

これを行う1つの方法は、for-eachループでStringを実行し、必要な分割文字を使用することです。

public class StringSplitTest {

    public static void main(String[] arg){
        String str = "004-034556";
        String split[] = str.split("-");
        System.out.println("The split parts of the String are");
        for(String s:split)
        System.out.println(s);
    }
}

出力:

The split parts of the String are:
004
034556

あなたはSplit()を使うことができます:

import Java.io.*;

public class Splitting
{

    public static void main(String args[])
    {
        String Str = new String("004-034556");
        String[] SplittoArray = Str.split("-");
        String string1 = SplittoArray[0];
        String string2 = SplittoArray[1];
    }
}

それ以外の場合は、StringTokenizerを使用できます。

import Java.util.*;
public class Splitting
{
    public static void main(String[] args)
    {
        StringTokenizer Str = new StringTokenizer("004-034556");
        String string1 = Str.nextToken("-");
        String string2 = Str.nextToken("-");
    }
}
7
Sarat Chandra

これが2つの方法です。

方法1:2つの数字を特殊文字で区切る必要があるので、正規表現を使用できます

import Java.util.regex.Matcher;
import Java.util.regex.Pattern;

public class TrialClass
{
    public static void main(String[] args)
    {
        Pattern p = Pattern.compile("[0-9]+");
        Matcher m = p.matcher("004-034556");

        while(m.find())
        {
            System.out.println(m.group());
        }
    }
}

方法2:文字列分割メソッドを使用する

public class TrialClass
{
    public static void main(String[] args)
    {
        String temp = "004-034556";
        String [] arrString = temp.split("-");
        for(String splitString:arrString)
        {
            System.out.println(splitString);
        }
    }
}
7
Akshay Gaikwad

StringTokenizerを使用すると、区切り文字の種類にかかわらず、文字列を2つ以上の部分に分割できます。

StringTokenizer st = new StringTokenizer("004-034556", "-");
while(st.hasMoreTokens())
{
    System.out.println(st.nextToken());
}
5
Rohit-Pandey

JavadocのStringクラスのsplit()メソッドを調べてください。

https://docs.Oracle.com/javase/7/docs/api/Java/lang/String.html#split(Java.lang.String)

String data = "004-034556-1212-232-232";
int cnt = 1;
for (String item : data.split("-")) {
        System.out.println("string "+cnt+" = "+item);
        cnt++;
}

ここでは分割文字列の例がたくさんありますが、コードはほとんど最適化されていません。

4
String str="004-034556"
String[] sTemp=str.split("-");// '-' is a delimiter

string1=004 // sTemp[0];
string2=034556//sTemp[1];
4
Shivanandam

あなたが本当に考慮する必要があるのは2つの方法だけです。

デリミタが1文字の場合、またはパフォーマンスを気にしない場合はString.splitを使用します

パフォーマンスが問題にならない場合、または区切り文字が正規表現の特殊文字ではない単一の文字(つまり.$|()[{^?*+\のいずれでもない)である場合は、String.splitを使用できます。

String[] results = input.split(",");

区切り文字が単一の文字で上記のリストにない場合、splitメソッドは正規表現を使用しないように最適化されています。そうでなければ、正規表現をコンパイルする必要があり、これは理想的ではありません。

複雑な区切り文字を使用していてパフォーマンスを気にする場合は、Pattern.splitを使用してパターンをプリコンパイルしてください

パフォーマンスが問題であり、区切り文字が上記のいずれでもない場合は、正規表現パターンを事前にコンパイルしてから再利用できます。

// Save this somewhere
Pattern pattern = Pattern.compile("[,;:]");

/// ... later
String[] results = pattern.split(input);

この最後のオプションはまだ新しいMatcherオブジェクトを作成します。最大のパフォーマンスを得るために、このオブジェクトをキャッシュして入力ごとにリセットすることもできますが、それはやや複雑でスレッドセーフではありません。

2
rghome

私は、Javaの組み込み関数を使用する代わりに、アルゴリズムを書きたいだけでした。

public static List<String> split(String str, char c){
    List<String> list = new ArrayList<>();
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.length(); i++){
        if(str.charAt(i) != c){
            sb.append(str.charAt(i));
        }
        else{
            if(sb.length() > 0){
                list.add(sb.toString());
                sb = new StringBuilder();
            }
        }
    }

    if(sb.length() >0){
        list.add(sb.toString());
    }
    return list;
}
1
None

文字列を分割するには、String.split(regex)を使います。

String phone = "004-034556";
String[] output = phone.split("-");
System.out.println(output[0]);
System.out.println(output[1]);

出力:

004
034556
0
KIBOU Hassan
String s="004-034556";
for(int i=0;i<s.length();i++)
{
    if(s.charAt(i)=='-')
    {
        System.out.println(s.substring(0,i));
        System.out.println(s.substring(i+1));
    }
}

みんなが言ったように、split()はあなたの場合に使えるかもしれない最良の選択肢です。別の方法としてsubstring()を使用することができます。

0
SAM Jr

文字列を分割するには、String.split(regex)を使用します。以下の例を確認してください。

String data = "004-034556";
String[] output = data.split("-");
System.out.println(output[0]);
System.out.println(output[1]);

出力

004
034556

注意このsplit(regex)は正規表現を引数として取ります。ピリオド/ドットのような正規表現の特殊文字はエスケープすることを忘れないでください。

0
KIBOU Hassan

私はstringValueと呼ばれる文字列を使用しましたが、これは「コインを持っている人、雨の中で楽しんでいる人、メモを持っている人は避難所を探すのに忙しかった」のようなものです。

「、」をコロンとして使用して、stringValueを分割します。

そして、3つの異なるTextViewのSetText()でその文字列を表示したいだけです。

String stringValue = "Those who had coins, enjoyed in the rain, those who had notes were busy looking for the shelter";
            String ValueSplitByColon[] = stringValue.split(",");

            String firstValue = ValueSplitByColon[0];
            String secondValue = ValueSplitByColon[1];
            String thirdValue = ValueSplitByColon[2];

            txtV1.setText(firstValue);
            txtV2.setText(secondValue;
            txtV3.setText(thirdValue;

次のように出力します:

  1. txtV1値は:-コインを持っている人

  2. txtV2値は次のとおりです。

  3. txtV3値は:-メモを持っている人が避難所を探すのに忙しかった

0
PRAMESH BHALALA

メソッドsplitを使うことができます

public class Demo {
    public static void main(String args[]){
        String str ="004-034556";
        if((str.contains("-"))){
            String[] temp=str.split("-");
            for(String part:temp){
                System.out.println(part);
            }
        }else{
            System.out.println(str+" does not contain \"-\".");
        }

    }
}
0
Jamith Nimantha