クラウドの時代となりWEB開発者の需要も増えてきてます。
WEBアプリの入力フォームではセキュリティ強化として入力制限をかけます。アプリの品質向上を高めるためにも正規表現を覚えることは必須となってます。Unix系(Linux)などのコマンドラインでも正規表現を覚えると作業効率があがりますので是非マスターしましょう。
この記事は、正規表現による作業効率化、セキュリティ向上を図るために記載しています。
目次
正規表現とは
一言で表すと パターンマッチング がしっくりくるかと思います。例えばWEBアプリのフォームで入力された文字に数字が含まれていたらエラーにするなど、パターンに一致しない(または一致する)ケースをエラーにすることができます。
正規表現は暗記する必要はありません。使っていると自然と覚えます。
最初はこういった技術がある程度の理解で大丈夫です。
例えば、大文字の英字(全角含む)だけ許可したい場合 pattern="[A-ZA-Z]*"
のように書きます。アルファベットのAからZまでの文字ならtrue それ以外がきたらfalse(エラー)にします。
正規表現の使用例
たとえば、以下のような入力フォームがあったとしましょう。IDの欄には正規表現で英大文字だけ許可するようにしています。
ちゃんと、英大文字のみで入力してくださいと出てますね。これで利用者に正しい値の入力を促すことができます。
正規表現をクライアウト側(html)で確認してみる
上記サンプルhtmlのコードになります。自分の端末にhtmlファイルを作成して、以下のコードを張り付けてみてください。動作を確認することができますよ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <!DOCTYPE html> <html lang="ja"><head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>入力チェックデモ@miyalog</title> <meta name="viewport" content="initial-scale=1"> <style type="text/css"> </style> <h1>入力チェックのデモ@miyamon-log</h1> <p> IDには英大文字のみ許可したい場合の動作確認 @クライアント側(html)で正規表現チェック </p> <!-- 入力フォーム START --> <form name="sampleform" action="test.html" method="post"> <p>ID:<input type="text" name="id" size="9" pattern="[A-ZA-Z]*" title="英大文字のみで入力して下さい。"></p> <p> <input type="submit" value="送信"></p> </form> <!-- 入力フォーム END --> <hr> </body></html> |
セキュリティを意識した入力フォームのチェック
WEBアプリなどの処理には クライアントサイド と サーバサイド の二つがあります。ざっくり絵にすると以下のような感じです。
クライアント側のJavaScript と サーバサイド側のJava 双方で様々な処理を行うことができます。
ここで注意してほしいのは、クライアント側は利用者の端末(ブラウザ)内で動作するため、利用者にちょっとした知識があれば入力チェックの制御を簡単に解除できてしまいます。
- リクエスト数が増えてしまい、サーバ側への負荷が増える。
- リクエストを送ってレスポンスが返ってくるまでエラーか分からないため、画面の応答品質(利便性)が低下する可能性がある。
- 入力チェックのエラーが発生するたびにクライアント側の通信量が増える
そのため、正規表現に限らずフォームの入力チェックはサーバ側とクライアント側双方に設定することをお勧めします。
正規表現をJava側で確認してみる
ここまでの説明でクライアント側(HTML)だけでなくサーバ側でも入力チェックを行う必要があることが分かりました。
ではJava側はどうすればいいのか。実際のコードを動かしてみましょう。Javaのutilクラスに用意されている以下を使います。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
実際にコードを書いてみました。
formTestA と formTestB に画面から入力された値を想定してセットしてます。Aは正常系、Bは異常系です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.util.*; import java.util.regex.Pattern; import java.util.regex.Matcher; public class Main { public static void main(String[] args) throws Exception { // 判定用 boolean matchResult; Matcher matcher; // 入力ケース:以下2つを想定 String formTestA = "123abc"; String formTestB = "123ABc"; // 英数字だけ許可する Pattern pattern = Pattern.compile("^[0-9a-zA-Z]*$"); // TestAの場合 System.out.println("テストAの入力の場合"); matcher = pattern.matcher(formTestA); matchResult = matcher.matches(); System.out.println(matchResult); // TestBの場合 System.out.println("テストBの入力の場合"); matcher = pattern.matcher(formTestB); matchResult = matcher.matches(); System.out.println(matcher.matches()); } } |
実際にコードを動かしてみましょう。このレベルであればブラウザで実行するだけで十分です。
無料で使えるサイトが増えてます。今回はpaizaを使ってみました。
[blogcard url="https://paiza.io/ja"]アクセスしたら無料で利用するを選択し、上記のコードを張り付けてみてください。(コードはJavaを選択してくださいねー)
準備ができたら実行してみましょう!
テストAの123abc
は ture となり、 テストBの123ABc
はfalseとなりましたね。
これで、サーバ側でも入力チェックができるようになりました。細かいInput/output周りはGitHubなどからサンプルコードを漁ってみることをお勧めします。
優秀な人のコードを見つけたら結構ラッキーです。いい勉強になりますよ。
[blogcard url="https://github.com/"]
よく使う正規表現一覧
ここでは、使われる正規表現のパターンを紹介します。
パターン | 正規表現コード |
---|---|
数値パターン | ^[0-9]*$ |
半角英字(小文字) | ^[a-z]+$ |
半角英字(大文字) | ^[A-Z]+$ |
英数字パターン | ^[0-9a-zA-Z]*$ |
全角パターン | ^[^ -~。-゚]+$ |
半角カナ | ^[ヲ-゚]*$ |
カンマ一致 | ^(?!.*,).*$ |
郵便番号 | ^[0-9]{3}-[0-9]{4}$ |
電話番号 | ^[0-9]{2,4}-[0-9]{2,4}-[0-9]{3,4}$ |
aから始まる | ^a |
aで終わる | a$ |
メールアドレス | ^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$ |
URL | ^(https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)$ |
abcのみ | [abc] |
まとめ
正規表について、ざっくり理解できたでしょうか。Javaで利用する前提で書きましたが、正規表現はサクラエディタなエディタやUnix系のコマンドラインなどでもよく使います。作業効率化に繋がれば幸いです。
正規表現の一覧以外にも、SQLやUnix系のコマンドの一覧も作成してます。よろしければご活用ください。
仕事で使うLinux/UNIXコマンド一覧
続きを見る
Oracle SQLコマンド:業務効率化のための実用的な一覧と使用方法
続きを見る
Git コマンド一覧
続きを見る