Java独習5章 -標準ライブラリ-
・ラッパークラス
・文字列の操作
・正規表現
・日付と時刻の表示
・ストリーム
・その他
5-1 ラッパークラス
ラッパークラス=値に過ぎない基本型のデータを包み込んで(ラップして)オブジェクトとしての機能を付与するクラス
大体は小文字の頭を大文字にしただけ
違いのはchar(Character)とint(Integer)くらい
しかし、一般的にはラッパークラスを使うときはコレクションに対して数値をセットするなどだけでまず基本型
基本型→ラッパークラスはボクシング(Boxing)という。逆はアンボクシング
ボクシング
Integer int_obj = 108;
アンボクシング
int i = int_obj;
そもそもボクシング(2つ合わせてオートボクシング)は避けるべき
数値から文字列変換
Java
System.out.println(Integer.parseInt("108")); //結果は108
System.out.println(Double.parseDouble("1.234")); //結果は1.234
System.out.println(Integer parseInt("FF", 16)); //255(第2引数指定で36進数まで変換可能)
System.out.println(DoubleparseDouble("0.653e2")); //65.3
数値から文字列変換
Java
System.out.println(Integer.toString(108));
System.out.println(Double.toString(1.234));
System.out.println(Integer.toString(255,16)); //ff
文字列の操作
文字列の長さを文字列の長さ比較はlengthだけでなく、codePointCountメゾットを用いることがある。
これはUnicodeの限界を超えた時点で1文字を4バイトと表現するから
Java
var str = "叱る";
System.out.println(str.codePointCount(0,str.length()));
//public int codePointCount(int begin, int end)
//文字列全体を検索するときには0,str.lengthを引数に
文字列の比較はcompareToメゾットを用いるが、大文字小文字を無視するならcompareToIgnoreCaseメゾットを用いる
equalsとequalsIgnoreCaseもある
空であるかどうかはisEmptyかisBlankかであるが違いは
前者は何も入っていないときで後者は全角半角のスペースやタブキーなども用いる
文字列の前後から空白を消すときはstripメゾットを用いる
前方の身はstrpLeadingで後者はstripTrailngをもちいる
文字列検索はindexOfとlastIndexOf
Java
public int index Of(String str [,int index]);
//後ろの引数は開始位置を示す
//無かったら―1を返す
文字列に特定の文字列が含まれているか
Java
public boolean contains(String s)
public boolean startsWith(String prefix [, int offset])
public boolean endsWith(String suffix)
//startsWithでは開始位置を指定できる
文字列から部分的要素を取り出したいときはsubStringメゾット
public String substring(int begin [, int end])
ただし1文字単位で抜き出したいときはcharAtを用いる
文字の区切りはsplitメゾット
文字列の連結はjoin
var str1 = "梅, 桃, 桜と杏子"
var result1 = str1.split("[, と]")
System.out.println(String.join("&", result1))
//梅&桃&桜&杏子
var str2 = "梅, 桃, 桜と杏子"
var result2 = str1.split("," 3)
System.out.println(String.join("&", result2))
//梅&桃&桜と杏子
文字列の成型はformatメゾット
Java
System.out.println(String.format("%sは%s、%d歳です", "さくら", "女の子", 6))
//さくらは女の子、6歳です
System.out.println(String.format("%.2sです", "さくら"))
//さくです
System.out.println("%5sです", "さくら")
// さくです
System.out.println("小数点%.2f", 1.23654)
//小数点1.24
var d = LocalDateTime.now();
System.out.println(String.format("%tF", d))
//2021-7-29
日付や時刻はDなら日付,tなら時刻(午前午後を定める)などある
5-3 正規表現
正規表現とはあいまいな文字列パターンを表現するための記法
郵便番号なら[0-9]{3}-[0-9]{4}=0-9から3文字で0-9から4文字
Javaでよく利用する正規表現パターン
XYZ・・XYZにマッチ
[XYZ]・・XかYかZ
[^XYZ]・・XかYかZ以外
[X-Z]・・XからZまで1文字
[X|Y|Z]・・X,Y,Zのいづれか
X*・・0文字以上のX
X?・・0か1文字のX
X+・・1文字以上のX
X{n}・・n回のX
^・・行の先頭
$・・行の後ろ
.・・任意の1文字
¥w・・大文字/小文字の英二と数字とアンダースコア
¥W・・文字以外に一致
¥d・・数字に一致
¥D ・・数字以外に一致
¥m・・改行に一致
¥r・・復帰に一致
¥t・・タブ文字に一致
¥s・・空白文字と一致
¥S・・空白以外の文字と一致
¥~・・「~」であらわされるもの
matchメゾット
public static bpplean matches(String regex, Char Sequence input)
実例
Java
import java.util.regex.Pattern;
public class RegMatches {
public static void main(String[] args) {
var tel = new String[] { "080-0000-0000", "084-000-0000", "184-0000" };
var rx = "\\d{2,4}-\\d{2,4}-\\d{4}";
for (var t : tel) {
System.out.println(Pattern.matches(rx, t) ? t : "アンマッチ");
// System.out.println(t.matches(rx) ? t : "アンマッチ");
}
}
}
文字列の検索
マッチした文字列を抜き出すときはPattern/Matcherクラスを利用
Java
import java.util.regex.Pattern;
public class RegMatcher {
public static void main(String[] args) {
var str = "会社の電話は0123-99-0000です。自宅は000-123-4567だよ。";
var ptn = Pattern.compile("(\\d{2,4})-(\\d{2,4})-(\\d{4})");
var match = ptn.matcher(str);
while (match.find()) {
System.out.println("開始位置:" + match.start());
System.out.println("終了位置:" + match.end());
System.out.println("マッチング文字列:" + match.group());
System.out.println("市外局番:" + match.group(1));
System.out.println("市内局番:" + match.group(2));
System.out.println("加入者番号:" + match.group(3));
System.out.println("-----");
}
}
}
Patternクラスはnewでインスタンス化できない
compileメゾット
public static Patterm compile(String regex, [int flags])
matcherメゾット
Java
public Matcher matcher(CharSequence input)
//主要メゾットは以下の通り
//boolean find([int start])・・次のマッチを検索
//boolean lookingAt()・・文字列先頭からマッチするか
//boolean matches・・文字列全体にマッチするか
//int start([int group])・・開始位置の取得
正規表現はいったんここまでで2周目にがっつりやろうと思います
後半で残りの時刻操作とストリームとその他やります