モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Java 文字列操作

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

作成日作成日
2016/06/19
最終更新最終更新
2019/11/24
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    0
    ステッカーを贈るとは?

    正規表現

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    class Main {
        public static void main(String args[]) {
    
            {
                // 完全一致
                Pattern pattern = Pattern.compile("^http://www\\.");
                Pattern pattern2 = Pattern.compile("abc", Pattern.CASE_INSENSITIVE);
                Matcher matcher = pattern.matcher("http://www.example.com");
                Matcher matcher2 = pattern2.matcher("ABC");
                System.out.println(matcher.matches()); //=> false (注意: 部分一致は find)
                System.out.println(matcher2.matches()); //=> true
            }
            {
                // 部分一致
                Pattern pattern = Pattern.compile("^http://www\\.");
                Pattern pattern2 = Pattern.compile("abc", Pattern.CASE_INSENSITIVE);
                Matcher matcher = pattern.matcher("http://www.example.com");
                Matcher matcher2 = pattern2.matcher("ABC");
                System.out.println(matcher.find()); //=> true
                System.out.println(matcher2.find()); //=> true
            }
            {
                // 部分一致を複数回実施すると false になります。
                Pattern pattern2 = Pattern.compile("abc", Pattern.CASE_INSENSITIVE);
                Matcher matcher2 = pattern2.matcher("abc|abcd");
                while(matcher2.find()) {
                    System.out.println(matcher2.group()); //=> abc => abc
                }
            }
    
            // 後方参照を用いた置換
            Pattern pattern3 = Pattern.compile("(a)b(c)");
            Matcher matcher3 = pattern3.matcher("abc|abcd");
            System.out.println(matcher3.replaceAll("$1_$2")); //=> a_c|a_cd
            System.out.println("abc|abcd".replaceAll("(a)b(c)", "$1_$2")); //=> a_c|a_cd (String クラスだけで実現; 後述の replace と区別)
    
            // 後方参照
            Pattern pattern4 = Pattern.compile("^(\\d{4})/(\\d{2})/(\\d{2})$");
            Matcher matcher4 = pattern4.matcher("9999/12/31");
            if(matcher4.find()) {
                System.out.println(matcher4.group(0)); //=> 9999/12/31
                System.out.println(matcher4.group(1)); //=> 9999
                System.out.println(matcher4.group(2)); //=> 12
                System.out.println(matcher4.group(3)); //=> 31
            }
    
            // ^ と $ の意味
            Pattern pattern5a = Pattern.compile("^xyz$");
            Pattern pattern5b = Pattern.compile("^xyz$", Pattern.MULTILINE);
            String str5 = "xyz\nxyz";
            System.out.println(pattern5a.matcher(str5).find()); //=> false (文字列全体の最初 ^ と最後 $)
            System.out.println(pattern5b.matcher(str5).find()); //=> true (各行の最初 ^ と最後 $)
        }
    }
    

    文字コードの変換

    import java.io.FileNotFoundException;
    import java.io.UnsupportedEncodingException;
    import java.io.PrintWriter;
    
    class Main {
        public static void main(String args[]) {
    
            // ファイルのエンコーディングは UTF-8 であるとします。
            // その場合、JVM は UTF-8 で起動する必要があります。
            // (環境によっては明示的に指定する必要があります
            //  java -Dfile.encoding=UTF-8 Main)
            String str = "ゆーてぃーえふえいと";
            System.out.println(System.getProperty("file.encoding")); //=> UTF-8
    
            // str には「文字列」が格納されています。デコードされており、既に UTF-8 ではありません。
    
            try {
                // 「文字列」をエンコードしてファイルに書き込む
                // (file.encoding の既定値でない場合、エンコーディング方法の指定が必要)
                PrintWriter pw = new PrintWriter("res.txt");
                // PrintWriter pw = new PrintWriter("res.txt", "Shift_JIS");
                // PrintWriter pw = new PrintWriter("res.txt", "EUC-JP");
                pw.write(str);
                pw.close();
            }
            catch(FileNotFoundException | UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            try {
                // 「文字列」を各種文字コードにエンコーディング
                // (file.encoding の既定値でない場合、エンコーディング方法の指定が必要)
                byte[] utf8 = str.getBytes();
                byte[] sjis = str.getBytes("Shift_JIS");
                byte[] euc = str.getBytes("EUC-JP");
    
                System.out.println(utf8); //=> [B@1540e19d
                System.out.println(sjis); //=> [B@677327b6
                System.out.println(euc); //=> [B@14ae5a5
    
                // エンコードされたバイト列を再び「文字列」にデコーディング
                // (file.encoding の既定値でない場合、デコーディング方法の指定が必要)
                String str1 = new String(utf8);
                String str2 = new String(sjis, "Shift_JIS");
                String str3 = new String(euc, "EUC-JP");
                System.out.println(str1); //=> ゆーてぃーえふえいと
                System.out.println(str2); //=> ゆーてぃーえふえいと
                System.out.println(str3); //=> ゆーてぃーえふえいと
            }
            catch(UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }
    

    Base64 エンコーディング (Java 8)

    import java.util.Base64;
    import java.util.Base64.Encoder;
    import java.util.Base64.Decoder;
    import java.io.UnsupportedEncodingException;
    
    class Main {
        public static void main(String args[]) {
            try {
                String str = "日本語";
                Encoder encoder = Base64.getEncoder();
                byte[] bytes = encoder.encode(str.getBytes("UTF-8"));
    
                // Base64 エンコード結果は ASCII コードのバイト列
                System.out.println(new String(bytes)); //=> 5pel5pys6Kqe
    
                Decoder decoder = Base64.getDecoder();
                byte[] bytes2 = decoder.decode(bytes);
    
                System.out.println(new String(bytes2, "UTF-8")); //=> 日本語
            }
            catch(UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }
    

    以下の結果と一致

    $ echo '日本語' | base64
    5pel5pys6Kqe
    

    URL エンコーディング

    import java.net.URLEncoder;
    import java.net.URLDecoder;
    import java.io.UnsupportedEncodingException;
    
    class Main {
        public static void main(String args[]) {
            try {
                String str = "http://www.example.com/search?q=日本語";
                String encoded = URLEncoder.encode(str, "UTF-8");
                System.out.println(encoded); //=> http%3A%2F%2Fwww.example.com%2Fsearch%3Fq%3D%E6%97%A5%E6%9C%AC%E8%AA%9E
    
                String decoded = URLDecoder.decode(encoded, "UTF-8");
                System.out.println(decoded); //=> http://www.example.com/search?q=日本語
            }
            catch(UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }
    

    ハッシュ値

    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.io.UnsupportedEncodingException;
    
    class Main {
        public static void main(String args[]) {
            try {
                // バイト列のハッシュ値を取得
                MessageDigest md5 = MessageDigest.getInstance("MD5"); // SHA-1, SHA-256
                md5.update("ABC".getBytes("UTF-8"));
                byte[] hash = md5.digest();
                System.out.println(hash.length); //=> 16
    
                // 16 進数文字列として出力
                StringBuilder sb = new StringBuilder();
                for(byte b : hash) {
                    String hex = String.format("%02x", b); // 16 進数 2 桁として表示 (1byte は 00 ~ ff)
                    sb.append(hex);
                }
                System.out.println(sb); //=> 902fbdd2b1df0c4f70b4a5d23525e932 (32 文字)
            }
            catch(NoSuchAlgorithmException | UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
    }
    

    以下の結果と一致

    $ echo 'ABC' | md5sum
    902fbdd2b1df0c4f70b4a5d23525e932  -
    

    数値と文字列の相互変換

    10 進数

    class Main {
        public static void main(String args[]) {
    
            // 不正な文字列のときは NumberFormatException が発生します。
            int i = Integer.parseInt("1");
            long l = Long.parseLong("1");
            double d = Double.parseDouble("1.0");
    
            System.out.println(i); //=> 1
            System.out.println(l); //=> 1
            System.out.println(d); //=> 1.0
    
            String iStr = String.valueOf(i); // 文字列に変換
            String dStr = String.valueOf(d);
        }
    }
    

    N 進数

    class Main {
        public static void main(String args[]) {
    
            // 文字列 → 数値
            int iBinary = Integer.parseInt("11111111", 2);
            int iHex = Integer.parseInt("ff", 16);
            int iHex2 = Integer.parseInt("FF", 16);
    
            System.out.println(iBinary); //=> 255
            System.out.println(iHex); //=> 255
            System.out.println(iHex2); //=> 255
    
            // 数値 → 文字列
            System.out.println(Integer.toBinaryString(iBinary)); //=> 11111111
            System.out.println(Integer.toHexString(iHex)); //=> ff
        }
    }
    

    その他の基本的な処理

    import java.io.UnsupportedEncodingException;
    
    class Main {
        public static void main(String args[]) {
    
            // 書式指定
            System.out.println(String.format("%s %d", "文字列", 123)); //=> 文字列 123
    
            // 長さ
            System.out.println("あいうえお".length()); //=> 5 (Unicode 文字列としての長さ)
            try {
                System.out.println("あいうえお".getBytes("UTF-8").length); //=> 15 (エンコードした結果のバイト数)
                System.out.println("あいうえお".getBytes("Shift_JIS").length); //=> 10 (エンコードした結果のバイト数)
            }
            catch(UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
            // 大文字小文字の変換
            System.out.println("Abc".toUpperCase()); //=> ABC
            System.out.println("Abc".toLowerCase()); //=> abc
    
            // 開始文字列および終了文字列の確認
            System.out.println("xyz".startsWith("xy")); //=> true
            System.out.println("xyz".endsWith("yz")); //=> true
    
            // ruby の strip 関数 (前後の半角スペースやタブ、改行を除去)
            System.out.println(" abc \n\t".trim()); //=> abc
    
            // 部分文字列
            System.out.println("あいうえお".substring(2)); //=> うえお (index: 2..-1)
            System.out.println("あいうえお".substring(2,3)); //=> う (index: 2..(3-1))
    
            // 分割
            String[] res = "a, bbb,c".split(",");
            System.out.println(res[0]); //=> a
            System.out.println(res[1]); //=> " bbb"
    
            // 連結
            // '+' 演算子は連結する度にメモリを確保して新しい String オブジェクトを生成します。
            // ループ処理などでは GC が頻発することに注意 (以下の例ではコンパイル時に "abcxyz" に最適化されるため問題なし)
            String str = "abc" + "xyz";
    
            // ループ処理時はこちらを使用
            StringBuilder sb = new StringBuilder();
            // StringBuffer sb = new StringBuffer(); // マルチスレッドではこちらが安全。StringBuilder と比較すると低速。
            sb.append("abc");
            sb.append("xyz");
            String str2 = sb.toString();
    
            // java8 のみ
            String str3 = String.join("_", "abc", "def", "xyz");
            java.util.ArrayList<String> list = new java.util.ArrayList<String>();
            list.add("abc");
            list.add("xyz");
            String str4 = String.join("_", list);
    
            System.out.println(str); //=> abcxyz
            System.out.println(str2); //=> abcxyz
            System.out.println(str3); //=> abc_def_xyz
            System.out.println(str4); //=> abc_xyz
    
            // 置換
            System.out.println("abbb|bb".replace("bb", "xx")); //=> axxb|xx (前述の replaceAll と異なり正規表現扱いされない)
    
            // 検索
            System.out.println("a,b,c,".indexOf(",")); // 1 (最初にヒットした箇所のインデックス)
            System.out.println("a,b,c,".indexOf("|")); // -1 (ヒットせず)
            System.out.println("a,b,c,".lastIndexOf(",")); // 5 (後ろから検索)
        }
    }
    

    StringUtils の導入

    Gradle や Maven において、The Central Repository で確認できる以下のような設定を行うことで、StringUtils という文字列処理のためのクラスが利用できるようになります。Apache Commons に含まれる Java の機能拡張ライブラリのうち、特に java.lang を拡張する Commons Lang が提供するクラスです。

    compile('org.apache.commons:commons-lang3:3.6')
    

    サンプルコード

    JavaDoc に豊富なサンプルコードが存在します。

    インポート

    import org.apache.commons.lang3.StringUtils;
    

    存在確認

    StringUtils.isEmpty(null); // true
    StringUtils.isEmpty(""); // true
    StringUtils.isEmpty(" "); // false
    
    StringUtils.isBlank(null); // true
    StringUtils.isBlank(""); // true
    StringUtils.isBlank(" "); // true
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    Javaちょっとできるプログラマ。教育業界のエンジニアです。

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Spring Security フォームログインのサンプルコード
        Spring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
        えびちゃんえびちゃん12/4/2019に更新
        いいねアイコン画像0
      • Java配列の宣言方法 (C/C++との違い)
        Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
        てんとうむしてんとうむし5/13/2018に更新
        いいねアイコン画像0
      • PlantUML による UML 図の描き方
        サムネイル画像-c788fffde5
        PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
        kentakenta1/21/2020に更新
        いいねアイコン画像0
      • Akka HTTP サンプルコード (Scala)
        サムネイル画像-a98142497c
        Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
        雄太雄太10/7/2021に更新
        いいねアイコン画像0
      • Kestrel の使用例
        Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...
        したくんしたくん10/12/2017に更新
        いいねアイコン画像0