このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

Similar documents
Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

ポインタ変数

正規表現応用

ポインタ変数

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Microsoft Word - no103.docx

文字列操作と正規表現

Java講座

ポインタ変数

正規表現概要

プログラミング入門1

エクセルの基礎を学びながら、金額を入力すると自動的に計算され、1年分の集計も表示される「おこづかい帳」を作りしょう

このうち ツールバーが表示されていないときは メニューバーから [ 表示 (V)] [ ツールバー (T)] の [ 標準のボタン (S)] [ アドレスバー (A)] と [ ツールバーを固定する (B)] をクリックしてチェックを付けておくとよい また ツールバーはユーザ ( 利用者 ) が変更

プログラミングA

情報処理Ⅰ

kantan_C_1_iro3.indd

関数とは 関数とは 結果を得るために 処理を行う仕組み です Excel2010 には あらかじめ関数が数式として組み込まれています たとえば SUM 関数 は 指定した値をすべて合計する 仕組みです 長い計算式や複雑な計算式を作成せずに 簡単に結果を求めることができます 例合計 =A1+A2+A3

プログラミングA

スライド 1

プログラミング入門1

やさしくPDFへ文字入力 v.2.0

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う PYTHON3 "

クイックマニュアル(利用者編)

<4D F736F F D20837D836A B5F93C192E88C AC888D593FC97CD5F2E646F63>


<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

正規表現詳細

JavaプログラミングⅠ

Section1_入力用テンプレートの作成

基礎計算機演習 実習課題No6

基礎プログラミング2015

PowerPoint プレゼンテーション

デジタル表現論・第6回

Microsoft PowerPoint - prog03.ppt

Prog1_3rd

Javaプログラムの実行手順

目次 1. 変換の対象 砂防指定地 XML 作成メニュー シェープファイルからXMLへ変換 砂防指定地 XMLとシェープファイルの対応.csv 変換処理 CSVファイルによる属性指定... 5

第12回 モナドパーサ

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ

文字入3-2 力3 文字入力について ひらがな 漢字 カタカナ 英数字 記号 絵文字などが入力できます ❶ ❷ ❸ ❶ 入力モード切替操作漢 : 漢字 ひらがな入力モード 1 カナ : カタカナ入力モード英 : 英字入力モード数 : 数字入力モード ❷ 全角 / 半角切替操作全 : 全角入力モード

プログラミングA

メソッドのまとめ

目次 更新履歴... 1 画面設計書の目的... 3 必要な内容... 3 画面一覧... 4 必要な内容... 4 画面遷移... 5 画面レイアウト... 6 入力パラメータ... 7 必要な内容... 7 項目定義... 8 必要な内容... 8 部品の種類... 9 ( 参考 ) 部品指定と

Microsoft Word - データ保管サービス操作マニュアル(第二版).docx

ガイダンス

第1部参考資料

文字入3-2 力3 文字入力について ひらがな 漢字 カタカナ 英数字 記号 絵文字などが入力できます 文字入力方式には モード1( かな方式 ) モード2(2タッチ方式 ) モード3( ニコタッチ方式 ) の3 種類があります 本書では モード1( かな方式 ) での入力例を中心に記載します モー

文字入3-2 力3 文字入力について ひらがな 漢字 カタカナ 英数字 記号 絵文字などが入力できます ダイヤルボタンの文字割り当てについて (ZP.17-12) ❶ ❷ ❸ ❶ 入力モード切替操作漢 : 漢字 ひらがな入力モード 1 カナ : カタカナ入力モード英 : 英字入力モード数 : 数字入

ポインタ変数

コードテンプレートフレームワーク 機能ガイド 基礎編

※ ポイント ※

JavaプログラミングⅠ

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 条件判断文 3 switch 文 switch 文式が case の値と一致した場合 そこから直後の break; までを処理し どれにも一致しない場合 default; から直後の break; までを処理する 但し 式や値 1

RR1soft.book

Si 知識情報処理

PowerPoint プレゼンテーション

NTT Communications Presentation

(Microsoft Word - \202v\202a\202s\203G\203N\203Z\203\213.doc)

問題1 以下に示すプログラムは、次の処理をするプログラムである

kiso2-03.key

プログラミング入門1

Microsoft Word - problem3.doc

譲渡人複数証明データコンバータ操作説明書 平成 26 年 6 月

Javaによるアルゴリズムとデータ構造

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Microsoft Word - manual

PowerPoint プレゼンテーション

<4D F736F F D D28F A82B582F182AB82F C DEC90E096BE8F E C52E646F63>

JavaScriptで プログラミング

スライド 1

2

Microsoft Word A08

Access研修テキスト

立ち読みページ

条件付き書式 の ルールの管理 をクリック 2 新規ルール をクリック 1 ルール の管理をクリック 3 指定の値を含むセルだけ書式設定 を クリック 7 グレーを選び OK をクリック 4 次の値に等しい を選ぶ 5 2 と入力 6 書式をクリック 8OK をクリック 以下同様に 新規ルール をク

人工知能入門

Taro-cshプログラミングの応用.jt

オブジェクト指向プログラミング・同演習 5月21日演習課題

Tips29: JavaScript で電話番号 ( 局番 ) の検証 / 編集 [ ] JavaScript JAVA 論理値 (True,False ) リテラル true, false が使えるリテラル

CONTENTS マニュアルの表記... S01-02_01 1.DataNature Smart 全体概要図... S01-02_11 2. 基本操作... S01-02_ ジョブの作成... S01-02_21 加工条件設定... S01-02_21 Step1: 処理対象データの指

5-2. 顧客情報をエクスポートする 顧客管理へのアクセス手順 メールディーラーで管理する顧客情報に関する設定を行います 1. 画面右上の 管理設定 をクリックする 2. 管理設定 をクリックする 3. ( タブ ) 顧客管理 をクリックする 2

プログラミング入門1

Microsoft Word - java a.doc

PowerPoint Presentation

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Java プログラミング Ⅰ 7 回目 switch 文と論理演算子 今日の講義講義で学ぶ内容 switch 文 論理演算子 条件演算子 条件判断文 3 switch 文 switch 文 式が case のラベルと一致する場所から直後の break; まで処理しますどれにも一致致しない場合 def

Microsoft PowerPoint ppt

とても使いやすい Boost の serialization

Web データ管理 JavaScript (1) (4 章 ) 2011/12/7( 水 ) 湘南工科大学講義資料 Web データ管理 (2011) 阿倍 1/21

Word2013基礎 基本操作

2011 年度春学期基礎ゼミナール ( コンピューティングクラス ) A コース 1 / 18 コンピュータリテラシー A コース 第 10 講 [ 全 15 講 ] 2011 年度春学期 基礎ゼミナール ( コンピューティングクラス ) 同志社大学経済学部 DIGITAL TEXT コンピュータリ

2

プレポスト【解説】

J-STAGE 記事登載時の入力データのチェック強化について

Prog1_2nd

簡易版メタデータ

データ構造

JavaプログラミングⅠ

Transcription:

正規表現について 作成日 : 2016/01/21 作成者 : 西村 正規表現? 正規表現 (Regular Expression Regex) というと難しいもののように感じますが 正規表現 というのは 文字のパターンを表したもの です ( 例 ) これはソエルで使用している見積書の番号です A1500033 この番号は 下記のルールで付けられています 固定 年度 固定 通番 ( 枝番 ) ルール "A" 数字 2 桁 0 を 2 桁 数字 3 桁 数字 2 桁 例 A 15 00 033 01 枝番はある時のみ こういったルール ( パターン ) の部分をプログラムで確認したり 必要な部分を抽出したりするために使うのが正規表現です 正規表現を使うと 下記のような利点があります 1. ユーザーに入力された文字が正しい形式かどうかを 1 文字 1 文字調べる長いプログラムを書かなくても プログラム 1 行でチェックできる 2. 文字のパターンをチェックしつつ 必要な部分のみ抽出して次の行以降で使用することができる ( 例えば上の見積書番号であれば 形式が正しいかチェックしつつ通番部分だけ取得して次の処理をするなど ) 3. 文字のパターンをチェックしつつ 必要な部分のみ置換することができる ( 例えば上の見積書番号であれば 年度部分のみ削除した A00033 のような形にしたい となったときにも簡単に対応できる ) 1

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字 3 桁 数字 2 桁 例 A 15 00 033 なし 正規表現 ^ A [0-9]{2} 00 [0-9]{3} ([0-9]{2})? $ なんとなく意味がわかりますか? ここで出てきた文字を整理すると 下記のようになります 記号 ^ 意味 最初である ということを示す記号です これがない場合は A1500033 も CBA1500033 も OK ということになります 巻末に補足があります 一通り読み進めて十分に理解したら見てみてください $ 最後である ということを示す記号です これがない場合は A1500033 も A1500033XXXX も OK ということになります 巻末に補足があります 一通り読み進めて十分に理解したら見てみてください [0-9] 半角の 0 から 9 までのいずれか ということを表します [] の中は いずれか という意味 - は ~ という意味です 巻末に補足があります 一通り読み進めて十分に理解したら見てみてください { 数字 } 回繰り返す ということを表します たとえば 3 回繰り返す なら {3} です [0-9]{2} は 0 から 9 までのいずれかの文字を 2 回繰り返す という意味です ( ルール )? かっこ内のルールがあってもなくてもよい という意味です 巻末に補足があります 一通り読み進めて十分に理解したら見てみてください 正規表現には 他にも特殊な記号 ( 特殊文字 ) があります 巻末に記載しておきます 正規表現チェッカー ( http://www.rider-n.sakura.ne.jp/regexp/regexp.php ) を使って パターン文字列 に正規表現を 対象文字列 の欄に A1500033 や A3400999 などを入れてみてください パターンに一致すると マッチした文字列 に赤い文字で表示されます 2

ざっくりとしたパターンで考えると 下記のようにもできます ^A.+$ これは下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 文字が 1 文字以上 例 A 1500033 150003300 正規表現 ^ A.+ $ なんとなく意味がわかりますか? ここで出てきた文字を整理すると 下記のようになります 記号意味. ドットは 任意の 1 文字 という意味です + 1 回以上 という意味です.+ は 1 文字以上 という意味になります 3

これを例えば PHP でチェックするプログラムを書くとすると 下記のようになります ( 正規表現を使わない時の例 ) <?php // 入力された文字とする $input = "A1500033"; // 1 文字ずつチェックする $len = strlen($input); $ok = true; for ($i = 0; $i < $len; $i++) { $c = $input[$i]; $n = $i + 1; {} } // 1 文字目が A if ($n == 1 && $c == "A") {} // 2,3,6,7,8,9,10 文字目が 0~9 else if (in_array($n, array(2,3,6,7,8,9,10), true) && ('0' <= $c && $c <= '9')) // 4,5 文字目が 0 else if (in_array($n, array(4,5), true) && ($c == '0')) {} // その他 else { $ok = false; break; } // 長さチェック $ok = ($ok && $len == 8 $len == 10); // 結果 echo " 結果 : ". ($ok? " " : " "). PHP_EOL; ( 正規表現を使う時 ) <?php // 入力された文字とする $input = "A1500033"; // パターン (PHP は先頭と終了に正規表現を示す文字 ( / や # ) が必要 ) $pattern = "#^A[0-9]{2}00[0-9]{3}([0-9]{2})?$#"; // チェック $ok = preg_match($pattern, $input); // 結果 echo " 結果 : ". ($ok? " " : " "). PHP_EOL; 1 行 (preg_match()) だけで形式のチェックができていることがわかると思います 4

C# や VB.NET で正規表現を使う場合は下記のようになります namespace ConsoleApplication3 { class Program { static void Main(string[] args) { // 入力された文字とする var input = "A1500033"; // パターン var pattern = @"^A[0-9]{2}00([0-9]{3})([0-9]{2})?$"; // チェック var ok = Regex.IsMatch( pattern, input ); // 結果 Console.WriteLine(" 結果 : " + (ok? " " : " ")); } } } 正規表現を使ってチェックするためのメソッドは下記になります 言語 メソッド 関数など 補足 PHP preg_replace( 正規表現, 文字列 ) 正規表現は "#...#" のような形で # や / で囲う JavaScript 正規表現.test( 文字列 ) 文字列.match( 正規表現 ) 正規表現は /.../ の形で / で囲う 引用符では囲わない C# VB.NET Regex.IsMatch( 文字列, 正規表現 ) 正規表現は @"..." の形で文字列の前に @ を付ける Java 文字列.matches( 正規表現 ) 正規表現内の \ を認識させるには \\ \\ を認識させるには \\\\ とする 5

文字のパターンから部分を抽出 丸かっこ ( ( と ) ) で囲んだものは グループ と呼ばれます 丸かっこでグループ化すると その部分を後から抽出することが出来ます 例えば 先程の見積書番号の通番だけ取りたい となった場合 ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ まず下記のように正規表現のパターンをグループ化します ^A[0-9]{2}00([0-9]{3})([0-9]{2})?$ PHP であれば 下記のようにします <?php // 入力された文字とする $input = "A1500033"; // パターン (PHP は先頭と終了に正規表現を示す文字 ( / や # ) が必要 ) $pattern = "#^A[0-9]{2}00([0-9]{3})([0-9]{2})?$#"; // チェック ($m は 結果が入る ) $ok = preg_match($pattern, $input, $m); // 結果 echo " 結果 : ". ($ok? " " : " "). PHP_EOL; if ($ok) { } echo " 通番 : ". $m[1]; // 033 が出力される $m[0] が全体 $m[1] が 1 番目のグループ ( キャプチャ結果 ) $m[2] が 2 番目のグループ ( キャプチャ結果 ) にな ります 6

必要な部分のみ置換 正規表現を使うと パターンにもとづいて必要な部分のみ置換することも出来ます 例えば 先程の見積書番号の年度だけ削除したい ( A1500033 A00033 ) となった場合 ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ まず下記のように正規表現のパターンをグループ化します 置換後の文字列は下記とします $1 $2 はグループ番号です PHP であれば 下記のようにします <?php // 入力された文字とする $input = "A1500033"; ^A[0-9]{2}00([0-9]{3})([0-9]{2})?$ A00$1$2 // パターン (PHP は先頭と終了に正規表現を示す文字 ( / や # ) が必要 ) $pattern = "#^A[0-9]{2}00([0-9]{3})([0-9]{2})?$#"; // 置換 ($result に 置換結果が入る ) $result = preg_replace($pattern, "A00$1$2", $input); echo " 結果 : ". $result. PHP_EOL; $m[0] が全体 $m[1] が 1 番目のグループ $m[2] が 2 番目のグループ になります 15 の部分が 13 14 32 99 でも置換ができるので 単純な置換よりも手間が省けます 7

テキストエディタなどでの正規表現置換 テキストエディタや開発環境 (Eclipse, Visual Studio, サクラエディタなど ) でも正規表現を使って置換ができます (Eclipse の例 Ctrl + F で出ます もしよければ実際にやってみてください ) 実際にはここまでの厳密な正規表現ではなく A..([0-9]+) を A$1 に置換 のようなざっくりとしたパターンで簡 単にやるほうがいいと思います (. は正規表現では任意の 1 文字 という意味です ) ( その他の例 ) 検索 置換 結果 (\r\n)+ \r\n 連続改行を 1 回ずつのみにできる "(.+)" $1 二重引用符で囲われた文字列の囲いを外せる \r\n "," 改行区切りの文字を "a","b","c" などの形でプログラムの配列などに含め たい場合に途中まで整形できる 8

( サクラエディタの例 Ctrl + R で出ます ) Visual Studio でも正規表現が使えますが Visual Studio 2012 以前の正規表現はグループ化のかっこが {} にな っていたり独自の正規表現になってしまっているのですごく使いづらいです 9

参考よくある正規表現の例 拡張子が画像ファイルか調べる (jpg, png, gif) 数値 (int) 正規表現 \.(jpe?g png gif)$ test1.png test2.jpg, test3.jpeg, test4.gif などが一致する. は特殊文字なので 普通の. として扱うには \ を付ける ^(0 [1-9][0-9]*)$ 改行 空白の繰り返し メールアドレス 0, 1, 10, 1234 などが一致する \r\n \s+ メールアドレスは厳密に確認しようとすると正規表現ではチェックできないくらい複雑なので下記くらいのルーズなチェックになることが多いです ^.+@.+\..+$ a@a.a などが一致する 10

参考特殊な文字の一覧 ( 開始 終了の記号 ) 記号意味 ^ 最初である ということを示す記号です 言語やモードによって 行の最初 という意味になるので注意が必要な場合があります PHP Ruby Perl 等の場合は代わりに \A を使うと確実に 文字列の最初 という意味になり安全です $ 最後である ということを示す記号です 言語やモードによって 行の最後 という意味になるので注意が必要な場合があります PHP Ruby Perl 等の場合は代わりに \z を使うと確実に 文字列の最後 という意味になり安全です ( 繰り返しや回数を表す記号 ) 記号意味 + 1 回以上 という意味です.+ は 1 文字以上 という意味になります * 0 回以上 という意味です.* は 0 文字以上 という意味になります { 数字 } 回繰り返す ということを表します たとえば 3 回繰り返す なら {3} です [0-9]{2} は 0 から 9 までのいずれかの文字を 2 回繰り返す という意味です? 直前にあるルールがあってもなくてもよい という意味です ( ルール )? かっこを付けるとグループ化がされます グループ化されないようにするには (?: ) という形にします 11

( 文字の範囲などを表す記号 ) 記号意味 [0-9] 半角の 0 から 9 までのいずれか ということを表します [] の中は いずれか という意味 - は ~ という意味です \d でも 0-9 という意味になりますが \d だと全角数字も一致する実装があるため注意してください [ 文字 - 文字 ] コード順での文字から文字までのいずれか ということを表します よく使うのは [a-z] ( 英小文字 ) や [A-Z] ( 英大文字 ) [a-za-z0-9] ( 半角英数字 ) です [ 文字 ] いずれかの文字 を表します 例えば [abc] だと a b c いずれかという意味です [^ 文字 ] いずれかの文字ではない ( 否定 ) を表します 例えば [^abc] だと a b c のどれでもないという意味です [^0-9] だと 数字以外 です ( ルール ) かっこ内のルールを 1 つのグループとします 例えば abc+ だと a が 1 回 b が 1 回のあと c が 1 回以上 (abcccc など ) になりますが (abc)+ だと "abc" が 1 回以上 (abcabcabc など ) という意味に変わります キャプチャしたくない場合は (?:abc)+ のように (?: ルール ) とします ( 特殊な文字 ) 記号 意味 \r キャリッジリターン (CR) です \n ラインフィード (LF) です \r\n だと CRLF になります \t タブ ( 水平タブ ) 文字です \s 空白です 実装によって全角を含んだりすることもあります \ 特殊文字のエスケープです \. などとします 12