Socketクラス

Similar documents
正規表現応用

正規表現概要

正規表現

ICONファイルフォーマット

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

グラフィックス

正規表現詳細

VB.NET解説

Userコントロール

ハッシュテーブル

ファイル操作-バイナリファイル

ListViewコントロール

ファイル操作

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

ファイル操作-インターネットキャッシュ

プラグイン

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

プロセス間通信

データアダプタ概要

NotifyIconコントロール

構造体

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

ファイル監視

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

データベースプログラミング

DAOの利用

TEXTOS-S: 検索 置換 連立検索置換式を使って 資料をマークし または変形します マークと 変形を同時にすることも可能です 検索式にはリテラル ( 文字列そのもの ) ワイルドカード 正規表現が選択できます 上のテキストボックスに検索式を直接書き込むときは [Ctrl]+[Enter] を押

VB実用⑦ エクセル操作Ⅰ

VB実用Ⅲ⑩ フリーデータベースⅡ

モグラ叩きプログラム

文字列操作と正規表現

回文作成支援プログラム

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

Microsoft Word - no103.docx

ルーレットプログラム

ブロック パニック

データベースⅠ

万年暦プログラム

ExcelVBA

MS Office オートメーション

回文作成支援プログラム

メール送信

Prog2_12th

Microsoft Excel操作

AQUOS ケータイ ユーザーガイド

かんたん携帯9 ユーザーガイド

Prog2_4th

回文作成支援プログラム

Microsoft PowerPoint - prog03.ppt

相性占いプログラム

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

JavaプログラミングⅠ

64bit環境で32bitコンポーネントの利用

sinfI2005_VBA.doc

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

メール受信

VB.NET解説

Prog2_15th

占領双六ゲーム

(Microsoft Word - 01PowerPoint\217\343\213\211C\203p\203^\201[\203\223\222m\216\257\225\\\216\206.doc)

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

ポインタ変数

情報処理Ⅰ

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

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

印刷

(Microsoft Word \203v\203\215\203O\203\211\203~\203\223\203O)

キー操作

基礎プログラミング2015

3D回転体プログラム

スレッド操作 タイマー

VB実用① データベースⅠ

ブロック崩し風テニス

ポインタ変数

グラフィックス 目次

コードページ

ICONファイルフォーマット

チャットプログラム

C 資料 電脳梁山泊烏賊塾 キャスト C++ のキャスト 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する C++ でのキャスト

WebBrowserコントロール

画像閲覧プログラム

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

チャットアプリ

相性占いプログラム

プログラミング実習I

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

5.1. ホームページ登録 ホームページ URL を登録します ホームページ URL は基本契約で 1 個 (100MB) まで無料 2 個目以降は有料オプションサービス ( 月額 300 円 / 個 ) で追加登録が可能です (1) 左メニューの HP アカウント登録 リンクをクリックします (1

ADO.NETのアーキテクチャ

構造体

講習No.1

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

単語の比較とスペルチェック COMPARA Word のテキスト内にある単語を抽出し 異なり語のリストを作成するプログラムです また Word のテキスト内の単語 ( または単語リスト ) を 先に作成した単語リストと照合して その異同を確かめます フォーム 単語リスト単語集計同語検索異語検索同語リ

_unix_text_command.pptx

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

スライド 1

Word2013基礎 基本操作

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

データベース1

アセンブラ C# で作られたプログラムをデコンパイル デコンパイルとは 大雑把に言うと コンパイルされたプログラム (exe dll 等 ) から 元のコードを復元する行為の事で有る 特に C# や Java の様に中間言語に翻訳された状態でコンパイルされる様な言語の場合は元のコードに可成り忠実に復

Transcription:

正規表現 正規表現の基本 此処では.NET Framework の正規表現に付いて基本を極く簡単に ( 主に正規表現パターンに付いて ) 説明する 猶.NET Framework の正規表現は Perl5 の正規表現に対応する様にデザインされて居ると謂う事なので Perl の正規表現を理解して居れば問題無い 猶 正規表現テストツール (RegexTest.exe) を使って正規表現のテストを行う事が出来るので 役に立てゝ欲しい 正規表現で何が出来るか 正規表現は 文字列を検索する為に使用する 正規表現を使うと 可成り複雑な検索が可能で有る 正規表現を利用する主なケースには以下の様な物が挙げられる 文字列内に指定されたパターンと一致する部分が有るか調べる 例えば 入力された文字列が電子メールアドレスと仕て適当か調べる等 文字列から指定されたパターンと一致する部分を検索 抽出する 例えば 文字列内に有る URL の部分を総て抜き出す等 文字列から指定されたパターンと一致する部分を探して別の文字列に置換する 例えば 文字列内に有る URL にリンク (<a> タグ ) を付けたり HTML のタグを削除する等 補足 : 此等以外にも 文字列を分割して配列にする場合にも使用出来る 此の場合は Regex.Split メソッドを使用する パターンは何の様に書けば良いか 斯んな文字列が出て来る部分を探して と謂う事を指定するには 其れを表現したパターンを書く必要が有る 適切なパターンを書ける様に成る事が 正規表現を勉強する最大の目標と成るで有ろう パターンは ファイルの検索等で使用される * や? 等のワイルドカードを理解して居るならば 此れと同じ様な物だと思って結構で有る 例えば 文字列から或る郵便番号と一致する部分を探し度いとする 其の郵便番号が決まって居り 123-4567 で有るならば パターンは 123-4567 の儘で良い 但し 此の様に探し度い文字列が決まって居るならば 正規表現を使う意味が無い 決まった郵便番号ではなく 郵便番号形式の文字列を探し度い 詰まり 何等かの数字が 3 個続き ダッシュ ( - ) が挟まり 亦 数字が 4 個続く文字列 を探し度いと謂う事で有れば 正規表現が役に立つ 此の様な場合 書く可きパターンは d d d- d d d d と成る ( 別の書き方も出来る ) 詰まり d は 何等かの数字 1 文字 を意味する 此の様に正規表現のパターンでは 等の特定の文字列が特別な意味を持って居る 此の様な特別な意味を持つ文字を メタ文字 ( メタキャラクタ ) と呼ぶ -1-

簡単な例.NET で正規表現を扱うには Regex クラスを使用する 以下に Regex クラスを使って文字列の検査 抽出 置換を行う簡単な例を示す 更に詳しい例に付いては 正規表現を使って文字列が或る形式と一致するか調べる 正規表現を使って文字列を検索し抽出する 正規表現を使って文字列を置換する を参照され度い ' TextBox1 に郵便番号形式の文字列が含まれて居るか調べる If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, " d d d- d d d d") Then Console.WriteLine(" 郵便番号が含まれて居る ") End If ' TextBox1 内の郵便番号形式の文字列を総て抽出する Dim mc As System.Text.RegularExpressions.MatchCollection = _ System.Text.RegularExpressions.Regex.Matches( TextBox1.Text, " d d d- d d d d") For Each m As System.Text.RegularExpressions.Match In mc Console.WriteLine(m.Value) Next ' TextBox1 内の郵便番号形式の文字列の "-" を削除して で囲む TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _ TextBox1.Text, "( d d d)-( d d d d)", " $1$2 ") // TextBox1 に郵便番号形式の文字列が含まれて居るか調べる if (System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, @" d d d- d d d d")) Console.WriteLine(" 郵便番号が含まれて居る "); // TextBox1 内の郵便番号形式の文字列を総て抽出する System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(TextBox1.Text, @" d d d- d d d d"); foreach (System.Text.RegularExpressions.Match m in mc) Console.WriteLine(m.Value); // TextBox1 内の郵便番号形式の文字列の "-" を削除して で囲む TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( TextBox1.Text, @"( d d d)-( d d d d)", " $1$2 "); メタ文字一覧 以下に良く使われるメタ文字と其の意味を紹介する 詳しくは MSDN の 正規表現言語要素 を参照され度い -2-

或る 1 文字を表す文字 ( アトム ) 文字説明使用例.( ピリオド ) s d w 改行文字 ( n) 以外の任意の一文字 ( 但し [ ] 内ではピリオド文字 ) 空白文字 改行文字 タブ文字 半角 / 全角スペース文字等 [ f n r t v x85 pz] と同じ ( 因みに S は s 以外の文字を表す ) 0 から 9 までの数字 全角を含む pnd と同じ ( 因みに D は d 以外の文字を表す ) 単語に使用される文字 アルファベット 数字 アンダーバー (_) ひらがな カタカナ 漢字等 [ pll plu plt plo pnd ppc plm] と同じ ( 因みに W は w 以外の文字を表す ) r キャリッジリターン ( u000d と同じ ) n ラインフィールド ( 改行文字 u000a と同じ ) t タブ ( u0009 と同じ ) 文字の前に を付けると 其の文字 メタ文字の機能を無効にする時に使う ( 或る文字列内のメタ文字を総て でエスケープするには Regex.Escape メソッドを使うと良い ) [ ] [ ] 内のどれか 1 文字 ([abc] ならば a か b か c) [^ ] [ - ] [^] 内の文字以外の 1 文字 ([^abc] ならば a か b か c 以外の文字 ) 連続した文字範囲の 1 文字 ([0-9] ならば数字 1 文字 [a-za-z] ならばアルファベット 1 文字 ) u0000 4 桁の 16 進数で表される Unicode 文字 x00 2 桁の 16 進数で表される ASCII 文字. 内に任意の 1 文字が有る箇所にマッチ Visual sbasic Visual と Basic の間に空白文字が 1 文字有る箇所にマッチ VB d VB の後に数字が 1 文字有る箇所にマッチ w 内に単語に使用される文字が 1 文字が有る箇所にマッチ r n Windows の改行文字 (CRLF) にマッチ r n Windows の改行文字 (CRLF) にマッチ n t 改行文字 ( n) の後にタブが続く箇所にマッチ DOBON.NET DOBON.NET にマッチ VB[2456] VB の後に 2 か 4 か 5 か 6 が続く箇所にマッチ [^ ] 内に 以外の 1 文字が有る箇所にマッチ VB[24-6] VB の後に 2 か 4 か 5 か 6 が続く箇所にマッチ [ uff61- uff9f] 半角カナ文字の 1 文字にマッチ [ x20- x7f] 半角英数記号文字 ( 0x20 ~ 0x7F) の 1 文字にマッチ 文字列内の位置を表す文字 ( アトミックゼロ幅アサーション アンカー 位置指定子 ) 此処で紹介するメタ文字は 文字列内の位置を表現した物で有る 文字とマッチする訳では無い -3-

^ $ b 文字説明使用例 ^ d 文字列の先頭先頭に有る数字 1 文字にマッチ 文字列の末尾 ( 但し 文字列の末尾が n の時は 其の前と一致 末尾が n でも末尾で一致させるには z を使う ) 単語の境界 ( w と W の間 ) と一致 ( 但し [ ] 内ではバックスペース文字 因みに B は b 以外の境界を表す ) d$ 末尾に有る数字 1 文字にマッチ bvb b VB が単語と仕て現れる箇所にマッチ 文字の繰り返しを表す文字 ( 量指定子 ) 此処で紹介する量指定子は 文字 ( 又は グループ ) の繰り返しを表現する物で有る 最長マッチと最短マッチの違いは非常に重要だが 此れに付いては後述する 文字説明使用例 <[^>]*> * 直前の文字が 0 回以上繰り返す <> で囲まれた箇所にマッチ + 直前の文字が 1 回以上繰り返す? 直前の文字が 0 回 又は 1 回繰り返す n,m n n, *? 直前の文字が n 回以上 m 回以下繰り返す 直前の文字が n 回繰り返す 直前の文字が n 回以上繰り返す 最短マッチで 0 回以上の繰り返し (? は * +? の後に付けて最短マッチを表す事が出来る 最短マッチと最長マッチに付いては 後述 ) <[^>]+> <> 内に 1 文字以上有る箇所にマッチ -? d+ マイナスが付いた数字 或るいは付かない数字にマッチ d2,6 数字が 2 文字以上 6 文字以下続いて居る箇所にマッチ d6 数字が 6 文字続いて居る箇所にマッチ d8, 数字が 8 文字以上続いて居る箇所にマッチ <.*?> <> で囲まれた箇所にマッチ 選択 グループ化等を表す文字 此処で紹介するグループ化を使用する主なケースと仕ては 論理和に依る選択を行う場合や 前方参照 ( 後述 ) や Match.Groups プロパティでの抽出を行い度い場合等が挙げられる.NET Framework にはグループに名前 ( 或るいは番号 ) を付ける事が出来ると謂う特徴が有る グループに名前を付けても付けなくても グループには 1 から連番で番号が付けられる ( 番号 0 はパターン全体で有る ) 此処では先読み 後読みアサーションも紹介して居るが 此等は少し高度で有る 従って 初心者は 此等を無視しても良いが 知って置くと可成り役に立つ -4-

因みに 後読みアサーションのパターンとマッチする文字列は固定長でなければ成らないとするエンジンが多いが.NET Framework では此の様な制限が無い 文字 説明 使用例 リンゴ りんご 林檎 で区切られた文字列の孰れか ( 論理和 ) リンゴ又はりんご又は林檎にマッチ ( ) グループ化する箇所 山田 ( 太郎 花子 ) 山田太郎又は山田花子にマッチ (?<name> ) グループに名前 ( 或るいは番号 ) を付ける ( 因みに < > の代わりに ' で括る事も出来る ) (?: ) キャプチャしないグループ (?= ) (?! ) (?<= ) (?<! ) 直後に此のパターンが現れる事を確認する ( ゼロ幅の肯定的先読みアサーション ) 直後に此のパターンが現れない事を確認する ( ゼロ幅の否定的先読みアサーション ) 直前に此のパターンが現れる事を確認する ( ゼロ幅の肯定的後読みアサーション ) 直前に此のパターンが現れない事を確認する ( ゼロ幅の否定的後読みアサーション ) VB(?<ver> d) VB の後に数字が有る箇所にマッチし 数字を "ver" と謂うグループ名でキャプチャ山田 (?: 太郎 花子 ) 山田太郎又は山田花子にマッチするが 太郎又は花子をキャプチャしない d+(?=%) 後ろに % が続く数字の連続にマッチ 但し % はマッチした箇所に含まれないし グループと仕てキャプチャもされない d+(?!%) 後ろに % が来ない数字の連続にマッチ (?<= ) d+ に続く数字の連続にマッチ 但し はマッチした箇所に含まれないし グループと仕てキャプチャもされない (?<! ) d+ 前に がない数字の連続にマッチ 前方参照 ( 後方参照 ) を表す文字 グループ化してキャプチャした文字列を後から参照する事が出来る 此れが前方参照 ( 後方参照 ) で有る 此れに依り キャプチャした文字列をパターンに埋め込む様な事が出来る 文字 説明 使用例 number 番号が number のグループと一致した文字列 <(H d)>.*?</ 1> <H> タグで囲まれた箇所にマッチ k<name> 名前が name のグループと一致した文字列 ( 因みに < > の代わりに ' で括る事も出来る ) <(?<tag>h d)>.*?</ k<tag>> <H> タグで囲まれた箇所にマッチ -5-

置換パターンで使用出来る特殊文字 前方参照 ( 後方参照 ) と同じ様に置換パターン内で以下の様な特殊文字を使用する事が出来る 前方参照と似て居る為 使用例は省略する 使用例は 正規表現を使って文字列を置換する を参照され度い 文字 $number $name $& 説明番号が number のグループと一致した文字列名前が name のグループと一致した文字列パターン全体と一致した文字列 良く使われるオプション オプションを指定する事も出来る オプションを指定するとメタ文字の意味が多少変わる物も有る.NET ではオプションを指定するのに RegexOptions 列挙体を使用する ( インラインで使用する方法も有るが 此処では紹介しない ) 以下に良く使われる重要なオプションを示す RegexOptions 列挙体のメンバ IgnoreCase Singleline Multiline ECMAScript 説明 大文字と小文字を区別しない.( ピリオド ) の意味を変更し n を含めた総ての文字と一致する様にする ^ と $ の意味を変更し 文字列全体の先頭と末尾丈でなく 行の先頭と末尾にも一致する様にする 具体的には ^ は n の後 $ は n の前 ( 改行文字が r n で有ったと仕ても ) にも一致する様に成る ^ と $ の代わりに A と Z を使用すると Multiline の影響を受けずに文字列全体の先頭と末尾に一致させる事が出来る ECMAScript 準拠の動作とする 此の事で 一部のメタ文字の意味が変更される 例えば w は [a-za-z_0-9] と同じに s は [^ f n r t v] と同じに d は [0-9] と同じに成る CultureInvariant 言語の違いを無視する Compiled 正規表現をコンパイルして実行速度を上げる ( 但し 起動時間は長く成る ) 最長マッチと最短マッチ 最長マッチと最短マッチの違いは非常に重要なので 此処で説明して置く 例えば 鈎括弧 ( ) で囲まれた文字列を抽出する為に次の様なパターン ( コード ) を書いたとする Dim mc As System.Text.RegularExpressions.MatchCollection = _ System.Text.RegularExpressions.Regex.Matches( TextBox1.Text, ".* ") System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches(TextBox1.Text, @".* "); -6-

此の様なパターンでは 鈎括弧が複数有った場合 問題が起こる 例えば TextBox1 に " あ い う " と入力されて居るならば マッチする文字列は " あ い う " の 1 つ丈で有る " あ " " い " " う " の 3 か所にマッチする様にするには パターンを ".*? " と書き換える 詰まり "*" の後ろに "?" を付けて 最短マッチにする "?" を付けないと最長マッチに成るので 一致する箇所が最も長く成る様な方法で検索が行われる 因みに上記の様な例で有れば 最短マッチにしなくても " [^ ]* " と書けば 粗同じ事が出来る 参考.NET Framework の正規表現 正規表現言語要素 -7-

正規表現を使って文字列が或る形式と一致するか調べる 指定された正規表現のパターンと一致する対象が入力文字列内で見付かるか何うかを調べるには Regex クラスの IsMatch メソッドを使用する 此処では IsMatch メソッドを使った例を幾つか紹介する 猶 正規表現のパターンと一致する個所を探し 見付かれば 其の箇所を抽出する方法は 正規表現を使って文字列を検索し 抽出する で紹介して居る 郵便番号か調べる 次の例では TextBox1 に入力された文字列が郵便番号形式か ( " 数字 3 文字 "-" 数字 4 文字 " 形式に成って居るか ) 調べて居る RegexOptions.ECMAScript を指定して居るのは d が半角の数字丈にマッチする様にする為で有る ' 郵便番号形式か調べる ' パターンは " d3- d4" とも書ける If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, "^ d d d- d d d d$", _ System.Text.RegularExpressions.RegexOptions.ECMAScript) Then Console.WriteLine(" 郵便番号です ") End If // 郵便番号形式か調べる // パターンは " d3- d4" とも書ける if (System.Text.RegularExpressions.Regex.IsMatch( TextBox1.Text, @"^ d d d- d d d d$", System.Text.RegularExpressions.RegexOptions.ECMAScript)) Console.WriteLine(" 郵便番号です "); 半角カナ文字が含まれて居るか調べる 次の例では TextBox1 に入力された文字列内に半角カナ文字 (Halfwidth CJK punctuation と Halfwidth Katakana variants) が有るか調べて居る 上記の例では静的メソッドの IsMatch を使用したが 此処ではインスタンスメソッドを使用して居る ' 正規表現パターンを指定して Regex オブジェクトを作成 Dim r As New System.Text.RegularExpressions.Regex("[ uff61- uff9f]") ' 半角カナ文字が含まれて居るか調べる If r.ismatch(textbox1.text) Then Console.WriteLine(" 半角カナ文字が含まれて居る ") End If -8-

// 正規表現パターンを指定して Regex オブジェクトを作成 System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex( @"[ uff61- uff9f]"); // 半角カナ文字が含まれて居るか調べる if (r.ismatch(textbox1.text)) Console.WriteLine(" 半角カナ文字が含まれて居る "); メールアドレスか調べる 次の例では TextBox1 に入力された文字列がメールアドレス形式か調べて居る 猶 MSDN の 方法 : 文字列が有効な電子メール形式で有るか何うかを検証する では別のパターンが紹介されて居る ' メールアドレス形式か調べる If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, "^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]2,4$", _ System.Text.RegularExpressions.RegexOptions.IgnoreCase) Then Console.WriteLine(" メールアドレスの様です ") End If // メールアドレス形式か調べる if (System.Text.RegularExpressions.Regex.IsMatch( TextBox1.Text, @"^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]2,4$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)) Console.WriteLine(" メールアドレスの様です "); URL か調べる 次の例では TextBox1 に入力された文字列が URL(HTTP) 形式か調べて居る 猶 此の正規表現パターンは Perl メモ で紹介されて居る物で有る ' URL 形式か調べる If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, "^s?https?://[-_.!~*'()a-za-z0-9;/?:@&=+$,%#]+$") Then Console.WriteLine("URL の様です ") End If // URL 形式か調べる if (System.Text.RegularExpressions.Regex.IsMatch( TextBox1.Text, @"^s?https?://[-_.!~*'()a-za-z0-9;/?:@&=+$,%#]+$")) Console.WriteLine("URL の様です "); -9-

電話番号か調べる 次の例では TextBox1 に入力された文字列が ( 日本国内の ) 電話番号形式かを大雑把に調べて居る ' 電話番号形式か調べる If System.Text.RegularExpressions.Regex.IsMatch( _ TextBox1.Text, "^0 d1,4- d1,4- d4$") Then Console.WriteLine(" 電話番号の様です ") End If // 電話番号形式か調べる if (System.Text.RegularExpressions.Regex.IsMatch( TextBox1.Text, @"^0 d1,4- d1,4- d4$")) Console.WriteLine(" 電話番号の様です "); -10-

正規表現を使って文字列を検索し抽出する 正規表現を使用して文字列の検索し 検索された文字列を取得するには Regex クラスと Match メソッド ( 又は Matchs メソッド ) を使用する 一致した要素は Match オブジェクトと仕て返される メールアドレスを抽出する 次の例では TextBox1 に入力された文字列からメールアドレス形式の文字列を総て検索し 表示する ' Regex オブジェクトを作成 Dim r As New System.Text.RegularExpressions.Regex( _ " b[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]2,4 b", _ System.Text.RegularExpressions.RegexOptions.IgnoreCase) ' TextBox1.Text 内で正規表現と一致する対象を 1 つ検索 Dim m As System.Text.RegularExpressions.Match = r.match(textbox1.text) ' 次の様に一致する対象を総て検索する事も出来る ' Dim mc As System.Text.RegularExpressions.MatchCollection = r.matches(textbox1.text) While m.success ' 一致した対象が見付かった時キャプチャした部分文字列を表示 Console.WriteLine(m.Value) ' 次に一致する対象を検索 m = m.nextmatch() End While // Regex オブジェクトを作成 System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex( @" b[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]2,4 b", System.Text.RegularExpressions.RegexOptions.IgnoreCase); // TextBox1.Text 内で正規表現と一致する対象を 1 つ検索 System.Text.RegularExpressions.Match m = r.match(textbox1.text); // 次の様に一致する対象を総て検索する事も出来る // System.Text.RegularExpressions.MatchCollection mc = r.matches(textbox1.text); while (m.success) // 一致した対象が見付かった時キャプチャした部分文字列を表示 Console.WriteLine(m.Value); // 次に一致する対象を検索 m = m.nextmatch(); -11-

HTML 内の <H> タグを抽出する 次にグループ化の例を示す 正規表現でグループ化を指定するには (?<( 数字又は名前 )>) の様にする 正規表現に一致したグループは Match クラスの Groups プロパティで取得出来る 猶 MSDN には HREFS のスキャン と謂う例や URL 情報の抽出 と謂う例が紹介されて居る 以下に TextBox1 に入力された文字列を検索して HTML の H タグ (H1 H2 H3...) と其の部分のテキストを抽出する例を示す 先程の例では Match メソッドを使用したが 今回は Matches メソッドを使用して観る 勿論 先程と同じ様に Match メソッドを使用しても構わない ' 正規表現パターンとオプションを指定して Regex オブジェクトを作成 Dim r As New System.Text.RegularExpressions.Regex( _ "<(h[1-6]) b[^>]*>(.*?)</ 1>", _ System.Text.RegularExpressions.RegexOptions.IgnoreCase Or _ System.Text.RegularExpressions.RegexOptions.Singleline) ' TextBox1.Text 内で正規表現と一致する対象を総て検索 Dim mc As System.Text.RegularExpressions.MatchCollection = r.matches(textbox1.text) For Each m As System.Text.RegularExpressions.Match In mc ' 正規表現に一致したグループの文字列を表示 Console.WriteLine(" タグ :" + m.groups(1).value + vbcrlf + _ " タグ内の文字列 :" + m.groups(2).value) Next // 正規表現パターンとオプションを指定して Regex オブジェクトを作成 System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex( @"<(h[1-6]) b[^>]*>(.*?)</ 1>", System.Text.RegularExpressions.RegexOptions.IgnoreCase System.Text.RegularExpressions.RegexOptions.Singleline); // TextBox1.Text 内で正規表現と一致する対象を総て検索 System.Text.RegularExpressions.MatchCollection mc = r.matches(textbox1.text); foreach (System.Text.RegularExpressions.Match m in mc) // 正規表現に一致したグループと位置を表示 Console.WriteLine(" タグ :" + m.groups[1].value + " n タグ内の文字列 :" + m.groups[2].value + " n タグの位置 :" + m.groups[1].index); HTML 内のリンクを抽出する 下の例は TextBox1 に入力された文字列を検索して <a href="...">...</a> でリンクされて居るリンク先 -12-

の URL とリンクされて居る文字列を総て調べ 結果を出力する物で有る 今迄の例ではインスタンスメソッドの Matches( 或るいは Match) を使用して居たが 今回は静的メソッドを使用して観る ' TextBox1.Text 内で正規表現と一致する対象を総て検索 Dim mc As System.Text.RegularExpressions.MatchCollection = _ System.Text.RegularExpressions.Regex.Matches( _ TextBox1.Text, _ "<a s+[^>]*href s*= s*(?:(?<quot>[""'])(?<url>.*?) k<quot> " + _ "(?<url>[^ s>]+))[^>]*>(?<text>.*?)</a>", _ System.Text.RegularExpressions.RegexOptions.IgnoreCase Or _ System.Text.RegularExpressions.RegexOptions.Singleline) For Each m As System.Text.RegularExpressions.Match In mc ' 正規表現に一致したグループを表示 Console.WriteLine("URL:0", m.groups("url").value) Console.WriteLine(" テキスト :0", m.groups("text").value) Next // TextBox1.Text 内で正規表現と一致する対象を総て検索 System.Text.RegularExpressions.MatchCollection mc = System.Text.RegularExpressions.Regex.Matches( TextBox1.Text, @"<a s+[^>]*href s*= s*(?:(?<quot>[""'])(?<url>.*?) k<quot> " + @"(?<url>[^ s>]+))[^>]*>(?<text>.*?)</a>", System.Text.RegularExpressions.RegexOptions.IgnoreCase System.Text.RegularExpressions.RegexOptions.Singleline); foreach (System.Text.RegularExpressions.Match m in mc) // 正規表現に一致したグループを表示 Console.WriteLine("URL:0", m.groups["url"].value); Console.WriteLine(" テキスト :0", m.groups["text"].value); 同じ番号 ( 名前 ) のグループが複数有る時 同じ番号のグループに複数の箇所が一致する場合が有る 例えば ( d)+ と謂うパターンで 123 を検索すると グループ 1 に 1 2 3 の 3 つの文字が一致する 亦.NET Framework ではグループに名前や番号を付ける事が出来るので 同じ名前や番号のグループを複数作る事も出来る 此の様に同じ名前や番号のグループが複数有った場合 何う成るかに付いて簡単に説明する 此の様な場合 グループの値と仕ては最後に一致したグループの値が入る 併し キャプチャされた総ての値は グループの Captures コレクションに格納されて居る 具体的に何う成るか 例を示す 以下の例では パターンを ( d)+ とし 123 と謂う文字列を検索して居る -13-

Dim r As New System.Text.RegularExpressions.Regex("( d)+") Dim mc As System.Text.RegularExpressions.MatchCollection = r.matches("123") For Each m As System.Text.RegularExpressions.Match In mc For i As Integer = 0 To m.groups.count - 1 Console.WriteLine(" グループ 0:1", i, m.groups(i)) For l As Integer = 0 To m.groups(i).captures.count - 1 Console.WriteLine(" キャプチャ 0:1", l, m.groups(i).captures(l).value) Next Next Next System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"( d)+"); System.Text.RegularExpressions.MatchCollection mc = r.matches("123"); foreach (System.Text.RegularExpressions.Match m in mc) for (int i = 0; i < m.groups.count; i++) Console.WriteLine(" グループ 0:1", i, m.groups[i]); for (int l = 0; l < m.groups[i].captures.count; l++) Console.WriteLine(" キャプチャ 0:1", l, m.groups[i].captures[l].value); 此のプログラムを実行すると 以下の様に表示される グループ 0:123 キャプチャ 0:123 グループ 1:3 キャプチャ 0:1 キャプチャ 1:2 キャプチャ 2:3 此の結果の様に グループ 1 には最後にキャプチャされた 3 が入るが グループ 1 の Captures にはキャプチャされた総ての結果が入って居る -14-

正規表現を使って文字列を置換する 正規表現を使って文字列の置換を行うには Regex クラスの Replace メソッドを使用する 此処では幾つかの具体例を紹介する MSDN にも 日付形式の変更 と謂う例が載って居るので 其方も参考にされ度い URL にリンクを付ける 次の例では TextBox1 に入力された文字列内の URL に自動的にリンク (<a> タグ ) を付けて TextBox1 に結果を表示して居る 猶 此の正規表現パターンは Perl メモ で紹介されて居る物で有る ' URL にリンクを付ける TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _ TextBox1.Text, _ "s?https?://[-_.!~*'()a-za-z0-9;/?:@&=+$,%#]+", _ "<a href=""$&"">$&</a>") // URL にリンクを付ける TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( TextBox1.Text, @"s?https?://[-_.!~*'()a-za-z0-9;/?:@&=+$,%#]+", "<a href= "$& ">$&</a>"); 行末の空白文字を削除する 次の例では TextBox1 に入力された文字列から総ての行末の空白文字 ( 半角スペース 全角スペース タブ ) を削除して居る 先程の例では静的メソッドの Replace を使用したが 此処ではインスタンスメソッドを使用して観る ' パターンを指定して Regex オブジェクトを作成 Dim r As New System.Text.RegularExpressions.Regex("[ t]+(?= r? n $)") ' 行末の空白文字を削除 TextBox1.Text = r.replace(textbox1.text, "") // パターンを指定して Regex オブジェクトを作成 System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"[ t]+(?= r? n $)"); // 行末の空白文字を削除 TextBox1.Text = r.replace(textbox1.text, ""); 因みに パターンを "[ t]+$" と仕て RegexOptions.Multiline オプションを付けたと仕ても 改行文字が " r n" ならば 行末の空白文字を削除する事は出来ない 何故ならば $ は n の前 r の後ろとマッチする為で有る -15-

行頭に引用記号を挿入する 次の例では TextBox1 に入力された文字列の行頭に < を挿入して居る パターンの ^ は 0 幅だが 置換に利用出来る ' 行頭に引用記号 "> " を挿入する TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _ TextBox1.Text, "^", "> ", System.Text.RegularExpressions.RegexOptions.Multiline) // 行頭に引用記号 "> " を挿入する TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( TextBox1.Text, "^", "> ", System.Text.RegularExpressions.RegexOptions.Multiline); 連続する同じ行を削除する 次の例では TextBox1 に入力された文字列から連続する同じ行を削除して居る 詰まり 同じ内容の行が連続して居る場合 其れを 1 行丈にする ' 連続する同じ行を削除 TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _ TextBox1.Text, "^(.*)( r? n 1)+$", "$1", _ System.Text.RegularExpressions.RegexOptions.Multiline) // 連続する同じ行を削除 TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( TextBox1.Text, @"^(.*)( r? n 1)+$", "$1", System.Text.RegularExpressions.RegexOptions.Multiline); 日付のフォーマットを変更する 2000/10/22 の様に / で区切られて居る形式の日付を 2000 年 10 月 22 日 と変更する例を示す ' "2000/10/22" の様な形式を "2000 年 10 月 22 日 " の様に変換する TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _ TextBox1.Text, _ "(?<year>(?: d d)? d d)/(?<month> d d?)/(?<day> d d?)", _ "$year 年 $month 月 $day 日 ") //"2000/10/22" の様な形式を "2000 年 10 月 22 日 " の様に変換する TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( TextBox1.Text, @"(?<year>(?: d d)? d d)/(?<month> d d?)/(?<day> d d?)", "$year 年 $month 月 $day 日 "); -16-

MatchEvaluator デリゲートを使用する MatchEvaluator デリゲートを使用すれば 更に複雑な置換が可能で有る 次の例では 日付の部分を 1 日増やした日付と置換して居る ' Button1 の Click イベントハンドラ Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles Button1.Click ' 日付の部分 ("2000/10/22" の様な形式 ) を 1 日増やす TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( _ TextBox1.Text, "(?<year>(?: d d)? d d)/(?<month> d d?)/(?<day> d d?)", _ New System.Text.RegularExpressions.MatchEvaluator(AddressOf IncrementDay)) End Sub ' MatchEvaluator デリゲートメソッド Private Shared Function IncrementDay( _ ByVal m As System.Text.RegularExpressions.Match) As String Dim dt As DateTime ' マッチした文字列を日時に変換 If DateTime.TryParse(m.Value, dt) Then Return dt.adddays(1).toshortdatestring() ' 1 日増やす Else Return m.value End If End Function // Button1 の Click イベントハンドラ private void Button1_Click(object sender, System.EventArgs e) // 日付の部分 ("2000/10/22" の様な形式 ) を 1 日増やす TextBox1.Text = System.Text.RegularExpressions.Regex.Replace( TextBox1.Text, @"(?<year>(?: d d)? d d)/(?<month> d d?)/(?<day> d d?)", new System.Text.RegularExpressions.MatchEvaluator(IncrementDay)); // MatchEvaluator デリゲートメソッド private static string IncrementDay(System.Text.RegularExpressions.Match m) DateTime dt; // マッチした文字列を日時に変換 if (DateTime.TryParse(m.Value, out dt)) return dt.adddays(1).toshortdatestring(); // 1 日増やす else return m.value; -17-