Java言語の文字列 (Stringオブジェクト)、文字列とバイト列の変換、正規表現マッチングと置換について学習します。
カリキュラムのサンプル コードは、「Javaコードの実行」に示す手順で実行して確認できます。文字列 (Stringオブジェクト )
文字列は Stringオブジェクトで扱います。Stringオブジェクトはクラス型変数で、内部に文字列を保持し、それを操作するためのメソッドを提供します。
- Stringはnew演算子を使う必要がなく、文字列を代入可能。
- 文字列の比較では、数値の比較は「==」で可能だが、文字列はオブジェクトため、同じ内容の文字列 (同値) でも同一とは限らない。文字列は「==」で比較せずに「equals」メソッド(=オブジェクトに属する処理や操作のこと)を使用する。
- 「length」メソッドは、保持している文字列の文字数を戻り値として返す。
- 「valueOf」メソッドは、引数に受け取ったint型の値をStringに変換して戻り値として返す。
- 「substring」メソッドは、そのインスタンス(=メインメモリ上に展開して処理・実行できる状態にしたもの)が保持する文字列から、一部分を切り取って新たな文字列にして戻り値として返す。文字列の並びを「0」から始まるインデックスを用いて割り当て、「substring」メソッドの最初のパラメータが開始インデックス(この位置にある文字は含まれる)、次のパラメータが終了インデックス(この位置にある文字は含まれない)になり、文字列が切り取られる。
String s = "あいうえお";
String s1 = "あいおうえ";
int i = 20;
System.out.println(s.equals(s1)); // false
System.out.println( s.length()); // 5
System.out.println(String.valueOf(i)); // 20
System.out.println( s.substring(1,4)); // いうえ
正規表現マッチングと置換
正規表現とは文字列のパターンを一つの形式でまとめて表現するために使用し、文字列から特定のパターンを検索して、一致する文字列が存在するかをチェックします。
※なおこの節については、難易度が高いため、余力のある方はご覧下さい
主な正規表現の記号と意味について次に示します。
記号 | 記号の説明 | 例 | 例の説明 |
---|---|---|---|
. | 任意の1文字。改行文字は除く | .+ | 任意の文字列 |
* | 直前の1文字の0回以上の繰り返しと一致 | hoge* | hogeもしくはhogee…と一致 |
^ | 行の先頭 | ^[0-9] | 行頭が数字 |
$ | 行の末尾 | .{10}$ | 10文字の行 |
[ ] | カッコ内の任意の1文字と一致。「-」で範囲指定可 | [a-z] | 小文字のアルファベット1文字と一致 |
[^ ] | カッコ内の任意の1文字と不一致。「-」で範囲指定可 | [^A-Z] | 大文字のアルファベット以外 |
+ | 直前の文字の1個以上の繰り返しと一致 | hoge+ | hogee…と一致 |
? | 直前の文字が0個または1個の場合に一致 | hoge? | hogeもしくはhogと一致 |
{ } | カッコ内の数値の繰り返しと一致 | {n} | 直前の文字のn個の繰り返しと一致 |
同上 | {,n} | 直前の文字のn個以下の繰り返しと一致 | |
同上 | {m,} | 直前の文字のm個以上の繰り返しと一致 | |
同上 | {m,n} | 直前の文字のm個以上、n個以下の繰り返しと一致 | |
| | 直前、直後どちらかのパターンに一致 | hoge|piyo | hogeまたはpiyo |
( ) | カッコ内をグループ化。マッチした内容は参照可 | – | – |
正規表現の処理を行うためには、import文を使って、PatternクラスとMatcherクラスを呼び出します。
Matcher クラスの find メソッドは、対象の文字列の中でパターンとマッチする部分があるかを検索します
import java.util.regex.Pattern;
import java.util.regex.Matcher;
// 正規表現マッチング
Pattern pat = Pattern.compile("aa");
Matcher matcher = pat.matcher("ababaabbb");
System.out.println(matcher.find()); // => true
正規表現を用いた置換のために「Matcher」オブジェクトの「replaceAll」メソッドと「replaceFirst」メソッドを利用します。「replaceAll」メソッドではマッチする箇所全てを置換します。一方、「replaceFirst」メソッドではマッチした最初の箇所だけを置換します。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
Pattern pat = Pattern.compile("aa");
// 置換
Matcher matcher2 = pat.matcher("[aa]ccc[aa]");
StringBuffer sb = new StringBuffer();
while (matcher2.find()) matcher2.appendReplacement(sb, "bb");
matcher2.appendTail(sb);
System.out.println(sb.toString()); // => [bb]ccc[bb]
// より簡単な方法としては replaceAll メソッドを使用する
Matcher matcher3 = pat.matcher("[aa]ccc[aa]");
System.out.println(matcher3.replaceAll("bb")); // => [bb]ccc[bb]
本節の説明は以上になります。