正規表現

Similar documents
正規表現概要

正規表現応用

Socketクラス

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

正規表現詳細

ICONファイルフォーマット

グラフィックス

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

VB.NET解説

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

Userコントロール

ファイル操作

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

ListViewコントロール

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

構造体

ハッシュテーブル

プロセス間通信

プラグイン

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

NotifyIconコントロール

データアダプタ概要

Microsoft Word - no103.docx

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

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

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

ファイル監視

文字列操作と正規表現

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

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

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

Prog2_12th

DAOの利用

ブロック パニック

回文作成支援プログラム

VB実用⑦ エクセル操作Ⅰ

ExcelVBA

ルーレットプログラム

モグラ叩きプログラム

ポインタ変数

Prog2_4th

Microsoft Word - no06.doc

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

万年暦プログラム

Prog2_15th

Microsoft Excel操作

回文作成支援プログラム

JavaプログラミングⅠ

sinfI2005_VBA.doc

情報処理Ⅰ

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

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

構造体

Microsoft PowerPoint - prog03.ppt

基礎プログラミング2015

ポインタ変数

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

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

(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( かな方式 ) での入力例を中心に記載します モー

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

講習No.1

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

キー操作

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

相性占いプログラム

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

回文作成支援プログラム

JavaScriptで プログラミング

XMLの利用(XMLとXSL)

データベースⅠ

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

メソッドのまとめ

メール送信

Word2013基礎 基本操作

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

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

MS Office オートメーション

チャットアプリ

印刷

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

占領双六ゲーム

プログラミング実習I

_unix_text_command.pptx

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

ICONファイルフォーマット

上の図がプロジェクトエクスプローラです 通常 VisualBasicEditor 画面の左上に配置されています Microsoft Excel Objects( ワークシート ) フォーム 標準モジュール クラスモジュールなどに分かれていて それらの集まりをプロジェクトといいます Excel のワー

コードページ

●コンテンツ「掲示板」

グラフィックス 目次

Excel2013 データベース1(テーブル機能と並べ替え)

3D回転体プログラム

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

フィルタとは

シーケンシャルファイルの操作

memo

相性占いプログラム

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

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

C#の基本

Transcription:

正規表現 正規表現に依りタグを抽出するパターン 使用して居るプログラミング言語に関わらず 文字列内から HTML タグの部分を抽出したり削除したりする事が有る 其の際 正規表現を使用するが 場合に依っては 確実に HTML タグを判別出来ない場合が有る 結局 広く知れ渡って居る正規表現パターンが正確に判別出来るが 他のパターンも含めて数種類のパターンを検証して観る ( 正規表現の説明付きで ) 準備 今回のテストでは 以下の様な文字列を取り扱う事にする 文字列をダブルクォーテーション ( " ) で囲んだり シングルクォーテーション ( ' ) で囲んだり タグの属性値内に更にタグを埋め込んだりして居る 此の画像 <img src="../images/example.png" alt='example.png' title='<img> タグ例 ' /> は <span> テスト画像 </span> です 此の文字列から HTML タグを判別して除去し 以下の様な文字にするパターンを考えて観る事にする 此の画像はテスト画像です パターン 1. テストパターン 1( 不正確なパターン ) <.*?>. は 改行を除く任意の 1 文字 * は 直前の表現の 0 回以上の繰り返しだが *? とする事で更に最短一致 依って < と最初の > で囲まれた任意の 0 文字以上の文字列を意味する 2. テストパターン 2( 不正確なパターン ) <\/?[^>]*> \/ は / 文字其の物 / 丈だと別の意味に成るのでエスケープして居る? は 直前の正規表現の 0 または 1 回の繰り返し [ ] は 文字クラス指定 [ ] 内に列挙した孰れかの 1 文字 ^ は [ ] 内の先頭にあれば [ ] 内に列挙されて居る指定文字以外の 1 文字 * は 直前の表現の 0 回以上の繰り返し -1-

依って < と > で囲まれ < の次に / が 0 個か 1 個で 残りが > 以外の文字列の事 言い換えれば テストパターン 1 の <.*?> と同じに成る 3. テストパターン 3( 正確なパターン ) <("[^"]*" '[^']*' [^'">])*> ( ) は 正規表現のグループ化 は 選択 (OR) "[^"]*" は " と次の " で囲まれた部分と謂う意味 此れは 此の部分を 1 個の塊と看做す為 '[^']*' は ' と次の ' で囲まれた部分と謂う意味 此れは 此の部分を 1 つの塊と看做す為 [^'">] は ", ', > 以外の 1 文字 " と " で囲まれた部分や ' と ' で囲まれた部分を 1 個の塊と看做して居るのに 更に " や ' が存在した場合は HTML タグではない 亦 > を除去するのは最短一致させる為で有る 4. テストパターン 4( 正確なパターン ) <(".*?" '.*?' [^'"])*?> 此れは テストパターン 3 の正規表現を書き換えた丈の物なので 此れも正確に HTML タグを判別出来る -2-

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

' 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 の 正規表現言語要素 を参照され度い -4-

或る 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 文字にマッ チ -5-

文字列内の位置を表す文字 ( アトミックゼロ幅アサーション アンカー 位置指定子 ) 此処で紹介するメタ文字は 文字列内の位置を表現した物で有る 文字とマッチする訳では無い 此処から 文字 ^ $ b 説明 文字列の先頭 文字列の末尾 但し 文字列の末尾が n の時は 其の前と一致 ( 末尾が n でも末尾で一致させるには z を使う ) 単語の境界 ( w と W の間 ) と一致 ( 但し [] 内ではバックスペース文字 ) ( 因みに B は b 以外の境界を表す ) 使用例 ^ d 先頭に有る数字 1 文字にマッチ d$ 末尾に有る数字 1 文字にマッチ bvb b VB が単語として現れる箇所にマッチ 文字の繰り返しを表す文字 ( 量指定子 ) 此処で紹介する量指定子は 文字 ( または グループ ) の繰り返しを表現する物で有る 最長マッチと最短マッチの違いは非常に重要ですが 此れに付いては後述する 文字説明 * 直前の文字が 0 回以上繰り返す + 直前の文字が 1 回以上繰り返す? 直前の文字が 0 回または 1 回繰り返す n,m 直前の文字が n 回以上 m 回以下繰り返す n n, *? 直前の文字が n 回繰り返す 直前の文字が n 回以上繰り返す 使用例 <[^>]*> <> で囲まれた箇所にマッチ <[^>]+> <> 内に 1 文字以上有る箇所にマッチ -? d+ マイナスが付いた数字 あるいは付かない数字にマッチ d2,6 数字が 2 文字以上 6 文字以下続いて居る箇所にマッチ d6 数字が 6 文字続いて居る箇所にマッチ d8, 数字が 8 文字以上続いて居る箇所にマッチ 最短マッチで 0 回以上の繰り返し? は * +? の後につけ <.*?> て最短マッチを表す事が出来る 最短マッチと最長マッチに付いて <> で囲まれた箇所にマッチは 後述 -6-

選択 グループ化等を表す文字 此処で紹介するグループ化を使用する主なケースとしては 論理和による選択を行う場合や 前方参照 ( 後述 ) や Match.Groups プロパティでの抽出を行い度い場合等が挙げられる.NET Framework にはグループに名前 ( あるいは番号 ) を付ける事が出来ると謂う特徴が有る グループに名前を付けても付けなくても グループには 1 から連番で番号が付けられる ( 番号 0 はパターン全体です ) 此処では先読み 後読みアサーションも紹介して居るが 此等は少し高度で有る ですので初心者の方は此等を無視していただいても構いませんが 知っておくと可成り役に立つ 因みに 後読みアサーションのパターンとマッチする文字列は固定長でなければならないとするエンジンが多いですが.NET Framework では此の様な制限が無い 文字説明使用例 で区切られた文字列の孰れか ( 論理和 ) ( ) グループ化する箇所 (?<name> ) リンゴ りんご 林檎リンゴまたはりんごまたは林檎にマッチ 山田 ( 太郎 花子 ) 山田太郎または山田花子にマッチ グループに名前 ( あるいは番号 ) を VB(?<ver> d) 付ける ( 因みに < > の代わりに ' VB の後に数字が有る箇所にマッチし 数字を "ver" で括る事も出来る ) と謂うグループ名でキャプチャ (?: ) キャプチャしないグループ (?= ) (?! ) (?<= ) (?<! ) 山田 (?: 太郎 花子 ) 山田太郎または山田花子にマッチするが 太郎または花子をキャプチャしない d+(?=%) 直後に此のパターンが現れる事を確後ろに % が続く数字の連続にマッチ 但し % はマ認する ( ゼロ幅の肯定的先読みアサッチした箇所に含まれないし グループとしてキャプーション ) チャもされない 直後に此のパターンが現れない事を d+(?!%) 確認する ( ゼロ幅の否定的先読みア後ろに % が来ない数字の連続にマッチ サーション ) (?<= ) d+ 直前に此のパターンが現れる事を確 に続く数字の連続にマッチ 但し はマッチし認する ( ゼロ幅の肯定的後読みアサた箇所に含まれないし グループとしてキャプチャもーション ) されない 直前に此のパターンが現れない事を (?<! ) d+ 確認する ( ゼロ幅の否定的後読みア前に がない数字の連続にマッチ サーション ) 前方参照 ( 後方参照 ) を表す文字 グループ化してキャプチャした文字列を後から参照する事が出来る 此れが前方参照 ( 後方参照 ) で有る 此れに依って キャプチャした文字列をパターンに埋め込む様な事が出来る -7-

文字説明使用例 number k<name> 番号が number のグループと一致した文字列 名前が name のグループと一致した文字列 ( 因みに < > の代わりに ' で括る事も出来る ) <(H d)>.*?</ 1> <H> タグで囲まれた箇所にマッチ <(?<tag>h d)>.*?</ k<tag>> <H> タグで囲まれた箇所にマッチ 置換パターンで使用出来る特殊文字 前方参照 ( 後方参照 ) と同じ様に置換パターン内で以下の様な特殊文字を使用する事が出来る 文字説明 $number 番号が number のグループと一致した文字列 $name 名前が name のグループと一致した文字列 $& パターン全体と一致した文字列 良く使われるオプション オプションを指定する事も出来る オプションを指定するとメタ文字の意味が多少変わる物も有る.NET ではオプションを指定するのに RegexOptions 列挙体を使用する ( インラインで使用する方法も有るが 此処では紹介しません ) 以下に良く使われる重要なオプションを示す RegexOptions 列挙体のメンバ IgnoreCase Singleline Multiline ECMAScript CultureInvariant Compiled 説明 大文字と小文字を区別しない.( ピリオド ) の意味を変更し n を含めた総ての文字と一致する様にする ^ と $ の意味を変更し 文字列全体の先頭と末尾だけでなく 行の先頭と末尾にも一致する様にする 具体的には ^ は n の後 $ は n の前 ( 改行文字が r n であったとしても ) にも一致する様に成る ^ と $ の代わりに A と Z を使用すると Multiline の影響を受けずに文字列全体の先頭と末尾に一致させる事が出来る ECMAScript 準拠の動作とする 此の事で 一部のメタ文字の意味が変更される 例えば w は [a-za-z_0-9] と同じに s は [^ f n r t v] と同じに d は [0-9] と同じに成る 其の他詳しくは ECMAScript と標準一致の動作の比較 言語の違いを無視する 正規表現をコンパイルして実行速度を上げる 但し 起動時間は長く成る 最長マッチと最短マッチ 最長マッチと最短マッチの違いは非常に重要ですので 此処で説明しておきます -8-

例えば カギかっこ ( ) で囲まれた文字列を抽出する為に次の様なパターン ( コード ) を書いたとする 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, @".* "); 此の様なパターンでは カギかっこが複数あった場合 問題が起こります 例えば TextBox1 に " あ い う " と入力されて居るならば マッチする文字列は " あ い う " の 1 つだけで有る " あ " " い " " う " の 3 か所にマッチする様にするには パターンを ".*? " と書き換えます 詰り "*" の後ろに "?" を付けて 最短マッチにする "?" を付けないと最長マッチに成るので 一致する箇所が最も長く成る様な方法で検索が行われます 因みに上記の様な例で有れば 最短マッチにしなくても " [^ ]* " と書けばほぼ同じ事が出来る 参考 :.NET Framework の正規表現正規表現言語要素 正規表現に依るタグ抽出 (.NET Framework 編 ) 正規表現を使って文字列の検索し 検索された文字列を取得するには Regex クラスと Match メソッド ( または Matchs メソッド ) を使用する 一致した要素は Match オブジェクトとして返されます メールアドレスを抽出する 次の例では TextBox1 に入力された文字列からメールアドレスっぽい文字列を総て検索し 表示する 此処で使用して居る正規表現パターンは Regular-Expressions.info で紹介されて居る物で有る '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 ' 一致した対象が見つかったときキャプチャした部分文字列を表示 -9-

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(); 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 + _ -10-

" タグ内の文字列 :" + 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> でリンクされて居るリンク先の 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>", -11-

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 と謂う文字列を検索して居る 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); -12-

此のプログラムを実行すると 以下の様に表示されます グループ 0:123 キャプチャ 0:123 グループ 1:3 キャプチャ 0:1 キャプチャ 1:2 キャプチャ 2:3 此の結果の様に グループ 1 には最後にキャプチャされた 3 が入りますが グループ 1 の Captures にはキャプチャされた総ての結果が入って居る 正規表現に依る文字列置換 (.NET Framework 編 ) 正規表現を使って文字列の置換を行うには Regex クラスの Replace メソッドを使用する 此処ではいくつかの具体例を紹介する MSDN にも 日付形式の変更 と謂う例が載って居るので そちらも参考にしてください URL にリンクを付ける 次の例では TextBox1 に入力された文字列内の URL に自動的にリンク (<a> タグ ) をつけて TextBox1 に結果を表示して居る '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 オブジェクトを作成 -13-

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 の後ろとマッチする為で有る 行頭に引用記号を挿入する 次の例では 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( -14-

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 日 "); 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 '1 日増やす Return dt.adddays(1).toshortdatestring() Else -15-

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)) //1 日増やす return dt.adddays(1).toshortdatestring(); else return m.value; -16-