記事のターゲット
- アノテーションを使用したバリデーション以外を使いたい人
- 仕事で文字チェックを実装する人
前提
入力画面があるアプリを作成するときに避けては通れないのが文字チェックだと思いますが、やりたいことによってその方法は多岐にわたります。
フレームワークを使用していて、もともと用意されている文字チェックを使えればそれでいいのですが、実際には複雑な文字チェックを実装しなくてはいけないタイミングが多いと思います。
そんな時に使える方法を紹介いたします。
今回使用するもの
public static final Pattern パターン名 = Pattern.compile("正規表現");
パターン名.matcher(検索したい文字列).matches()
上記の文法を使用します。すごく簡単に言うと、まず最初にチェックするルールをPatternというクラスを使用して作成しておき、チェックしたい文字と合致しているかを調べさせます。
以下具体例でみていきましょう。
step
1数字のみ許可する場合
import java.util.regex.Pattern;
public class aaa {
public static final Pattern NUM_ONLY = Pattern.compile("^[0-9]+$");
public static void main(String[] args) {
String chkNum1 = "1569";
String chkNum2 = "aa23";
if(NUM_ONLY.matcher(chkNum1).matches()) {
System.out.println("chkNum1は数字のみ使用されているよ");
}else {
System.out.println("chkNum1は数字以外が使用されているよ");
}
if(NUM_ONLY.matcher(chkNum2).matches()) {
System.out.println("chkNum2は数字のみ使用されているよ");
}else {
System.out.println("chkNum2は数字以外が使用されているよ");
}
}
}
chkNum1は数字のみ使用されているよ
chkNum2は数字以外が使用されているよ
step
2パターンの中身を変えてみよう
前述した例をテンプレとして、正規表現の部分だけ変えればいろんなものに対応できます。
以下結構使える正規表現です。
正規表現 | マッチするもの |
---|---|
^([0-9]|\\.)+$ | ・数字とピリオドのみ。 ピリオドの前にあるバックスラッシュはエスケープ文字と言って、正規表現だと特別な意味を持つピリオドをただの文字として扱うために記述します。ピリオドは単体で使うと「なんでもいいから1文字」という意味になります。 |
^([a-z]|[A-Z]|[0-9])+$ | ・英数字のみ。 [ ]の中でa-zみたいに記述すると範囲指定ができます。もちろん[a-g]みたいに終わりがzである必要はありません。 また[ ]と[ ]の間に|みたいな記号が挟んであるのですが、これはorと同じ意味です。 |
^(G|H).*$ | ・GかHから始まる文字列のみ(GとHの部分は好きな文字に変えてください)。 先ほどから出てきている^の記号は行頭を指定する正規表現です。 |
.*([a-z]|[A-Z])$ | ・末尾が英字の文字列のみ。 $マークは末尾を指定する正規表現です。 |
^([a-z]|[A-Z]|[0-9]|[-_.\r\n@])+$ | ・メールアドレスのみ(改行も可)。 \r\nの部分は改行を表す正規表現です。 |
まとめ
今回使用した正規表現は結構基本的なものだけなので初めて正規表現に触れる方でも理解しやすいかと思います。
個人的にも正規表現はとても重要なスキルだと思っており、文字チェック以外にも検索や置換等で強みを発揮できるものです。
私も正規表現は得意と呼べるほどのスキルを持っているわけではないので今後も勉強を続けていきたいと思います。