文字列の加工・切取

プログラム言語では、文字列の加工・切取操作も多く利用されます。

Stringクラスには、文字列操作のために多くのメソッドが提供されています。Oracle社のJava8JavaAPIをご確認下さい。

文字列の置換

replaceAll
String result = Stringのインスタンス.replaceAll( "正規表現" , "置換文字列")
replaceAllサンプル
    String str = "Javaプログラムは、オブジェクト指向言語であり、大変学習がしやすいです。 " +
                  "JAVAは、英語でジャワ産のコーヒーも意味します。JAvaのロゴが、コーヒーカップだったの理解できます。";

    String newStr  = str.replaceAll("プログラム" ," Program" ) ;
    String newStr2 = str.replaceAll("(?i)JAVA" ,"Java" ) ;
    System.out.println("str:" + str);
    System.out.println("newStr:" + newStr);
    System.out.println("newStr2:" + newStr2);
					 
実行結果
str:Javaプログラムは、オブジェクト指向言語であり、大変学習がしやすいです。 JAVAは、英語でジャワ産のコーヒーも意味します。JAvaのロゴが、コーヒーカップだったの理解できます。
newStr:Java Programは、オブジェクト指向言語であり、大変学習がしやすいです。 JAVAは、英語でジャワ産のコーヒーも意味します。JAvaのロゴが、コーヒーカップだったの理解できます。
newStr2:Javaプログラムは、オブジェクト指向言語であり、大変学習がしやすいです。 Javaは、英語でジャワ産のコーヒーも意味します。Javaのロゴが、コーヒーカップだったの理解できます。
					 

重要replaceAllのメソッドは、インスタンス.replaceAllでインスタンスそのもの値を変えません。(str結果より)
戻り値に返されるStringが置換された新しい文字列を返しています。(newStr,newStr2結果)
ここは、Java経験が浅い人が間違いやすい点です。replaceメソッドによりインスタンス自体が置換されると誤解しやすいです。

newStrのサンプルでは、"プログラム"を" Program" に置換する単純な置換方法です。
指定した文字列に完全一致した文字列のみを指定した置換文字列に置換します。

newStr2のサンプルでは、英字の大文字小文字問わず「JAVA」の4文字に該当する文字列を「Java」に置換する命令を出しています。

正規表現は、非常に便利な機能で画面の入力文字のチェック(validate処理)などに利用されます。

以下のサイトを一読して、幾つか正規表現やPatternなどを試すと理解が深まります

正規表現のサンプル集は、いずれかのタイミングでリリースします。

文字列の分割

split
String[] resultArrays = インスタンス.split( 区切り文字[正規表現] );
splitのサンプル
	String str = "Java1.4,JAVA5,JavaSE,JAva,JDK,Java";
	String[] strArrays = str.split(",");
	String[] strArrays2 = str.split("(?i)JAVA");

	for( int i = 0 ; i < strArrays.length ; i++ ){
		System.out.println("strArrays[" + i + "]=" + strArrays[i]);
	}

	for( int i = 0 ; i < strArrays2.length ; i++ ){
		System.out.println("strArrays2[" + i + "]=" + strArrays2[i]);
	}
						 
実行結果
strArrays[0]=Java1.4
strArrays[1]=JAVA5
strArrays[2]=JavaSE
strArrays[3]=JAva
strArrays[4]=JDK
strArrays[5]=Java
strArrays2[0]=
strArrays2[1]=1.4,
strArrays2[2]=5,
strArrays2[3]=SE,
strArrays2[4]=,JDK,
					 

指定範囲の切り取り

Stringのインデックス画像

任意の文字列から文字列の位置を指定して指定範囲の文字列を取得するメソッドがsubstringです。

substring
String result = インスタンス.substring( 開始位置 , 終了位置 );
substringのサンプル
    String testJa = "Javaプログラムは、とても理解し易い言語です。";
    String newStr = testJa.substring( 4, 9 );
    System.out.println( newStr );
						 
実行結果
プログラム
					 

substringは、ビジネスロジックを処理する際に大変良く利用されるメソッドの一つです。
ここで重要なのが、開始位置と終了位置の指定方法です。上記例は数値の4,9を直接指定しているのがハードコーディングです。

大規模のシステムでは、このsubstring( 開始位置, 終了位置)のハードコーディングがソースファイルに点在していると、
ソースファイルの運用性を著しく低下させます。

開始位置、終了位置でハードコーディングして良い数値は、「0」(文字列先頭位置)と「インスタンス.legnth()」(文字列終了位置)だけです。

具体的なサンプルを以下に示します。

substringのサンプルクラス
package jp.co.yourcompany.education.samples;

/**
 * splitのサンプルクラス
 * @author raita.kuwabara
 */
public class UserIdCode {

    /**
     * ユーザIDの固定長
     */
    public static final int USER_ID_MAX_LENGTH = 15;
    /**
     * ユーザIDのビジネスロジックは「先頭8桁が入会日(西暦8桁)」
     */
    public static final int USER_ID_JOIN_DATE_LENGTH = 8;
    /**
     * ユーザIDの9から10桁が都道府県コード
     */
    public static final int USER_ID_PREFECTURES_CD_LENGTH = 2;
    /**
     * ユーザIDの連番部分は5桁
     */
    public static final int USER_ID_SEQUENCE_LENGTH = 5;

    /**
     * 入会日西暦8桁
     */
    private String joinDateCd = null;
    /**
     * 都道府県CD2桁
     */
    private String prefecturesCd = null;
    /**
     * 連番コード
     */
    private String sequenceCd = null;

    /**
     * デフォルトコンストラクタ
     * @param userId 利用者ID
     * @return 分割した利用者IDのDTO
     */
    public UserIdCode( String userId ){
        //userId は15桁であるvalideチェックが事前処理で終わっていることが前提
        setJoinDateCd( userId.substring( 0 , UserIdCode.USER_ID_JOIN_DATE_LENGTH  ) );
        setPrefecturesCd( userId.substring( UserIdCode.USER_ID_JOIN_DATE_LENGTH ,
                UserIdCode.USER_ID_JOIN_DATE_LENGTH  + USER_ID_PREFECTURES_CD_LENGTH  ) );
        setSequenceCd( userId.substring( userId.length() -  USER_ID_SEQUENCE_LENGTH ,
                userId.length()  ) );
    }

    //コメント割愛
    public String getJoinDateCd() {
        return joinDateCd;
    }
    public void setJoinDateCd(String joinDateCd) {
        this.joinDateCd = joinDateCd;
    }
    public String getPrefecturesCd() {
        return prefecturesCd;
    }
    public void setPrefecturesCd(String prefecturesCd) {
        this.prefecturesCd = prefecturesCd;
    }
    public String getSequenceCd() {
        return sequenceCd;
    }
    public void setSequenceCd(String sequenceCd) {
        this.sequenceCd = sequenceCd;
    }

    public String toString(){
        return "[JoinDateCd]" + getJoinDateCd() +
                "[perfecutresCd]" + getPrefecturesCd() +
                "[sequenceCd]" + getSequenceCd();
    }

    public static final void main( String[] args ){

        String userId = "201402054100005";
        UserIdCode userIdCode = new UserIdCode( userId );
        System.out.println( userIdCode.toString() );
    }
}
						 
実行結果
[JoinDateCd]20140205[perfecutresCd]41[sequenceCd]00005
					 

このように開始位置がインデックスを示しており、文字数ではない点や最終位置が指定した終了位置の-1までの文字列を切り取ります。

開発現場で、間違いが起きやすいメソッドのため必ず上記例のようにDtoや共通関数クラスを作成してsubstringが、
それぞれのJavaソースファイルで記述しないようにします。

また、substringを利用する場合には、何かしらのlegnth()を利用して表記する事で意味が明確になります。

優れた開発チームでは、このsubstringはcommon(共通パッケージを意味)のクラスにしか出現しません。

大文字小文字変換

toUpperCase()
String result = インスタンス.toUpperCase();
toUpperCase()
String result = インスタンス.toLowerCase();
toUpperCase及びtoLowerCaseのサンプル
    System.out.println( "Java".toUpperCase() );
    System.out.println( "Java".toLowerCase() );
						 
実行結果
JAVA
java