[C#][VB.NET] 正規表現でHTMLのタグの要素と属性を取得する

[C#][VB.NET] 正規表現でHTMLのタグの要素と属性を取得する

正規表現のサンプル

いろいろなデータ形式についての正規表現をまとめます。一応それっぽくまとめているので参考程度にどうぞ。 .NET と Javascript をよく使うので、どちらでも使えるサンプルを用意しました。

.NET と Javascript の正規表現では、微妙にメタ文字の意味等が異なったりしますが、とりあえずは同じようにマッチします。 厳密ではありませんが、どちらでもだいたい問題なくマッチするのは確認済です。

郵便番号(ハイフンあり7桁)

\d{3}-\d{4}

郵便番号として、3桁の数+ハイフン+4桁の数からなる文字列として判定しています。

携帯番号(ハイフンあり11桁)

0[98]0(-\d{4}){2}

090, 080, 070のいずれかから始まり、(-xxxx)が2回続きます。

西暦日付

(19|20)\d\d([- /.])(0[1-9]|1[012])\2(0[1-9]|[12][0-9]|3[01])

日付を表す文字列にマッチする正規表現は、単純に年月日をそれぞれ4桁、2桁、2桁の数で表すだけだと簡単ですが、上の例はもう少し凝った正規表現です。 まず西暦年を1900-2099年までとし、月部分は01-12月まで、日部分は01-31までを取る正規表現としています。 区切りは / – のいずれかにマッチし、後方参照を利用することで異なる区切り文字が同時に利用されるものにはマッチしないようにしています。

ただしこの例でも、11月31日のようなありえない日付でもマッチしてしまいます。 これを解消しようとすると、4,6,9,11月について30日までとし、2月については28日までとするような場合分けがさらに必要になります。 それに加えうるう年も考慮に入れるとかなり複雑になります。日付の妥当性のチェックはプログラムで処理するべき問題でしょう。

メールアドレス(だいたいマッチ)

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]

あらゆるメールアドレスにたいして厳密にマッチさせるためには、かなりややこしい正規表現が必要になります。 どうやらメールアドレスにはマルチバイト文字に対応したものもあるらしいのですが上の例では考慮していません。 実際そんなメールアドレスは見たこともないのですし、ほぼすべてのアドレスにマッチするはずです。

URL

http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

URLについてもどこまでみるかで変わるのですが、上の例では、httpもしくはhttpsのURLにマッチさせています。

IPアドレス

(\d|[01]?\d\d|2[0-4]\d|25[0-5])(\.(\d|[01]?\d\d|2[0-4]\d|25[0-5])){3}

IPアドレスは、0-255にマッチする正規表現を用意し、それを繰り返せば完成です。 内容としては「0-9」もしくは「10-199」もしくは「200-249」もしくは「250-255」の組み合わせで、「0-255」を表現しています。

3桁カンマ区切りの数値

[1-9]\d{0,2}(,\d{3})*

「1-999」の後ろにカンマ付きの3桁の数が続きます。先頭を[1-9]としているのは0を含むと「000,000」みたいな数にマッチしてしまうからです。

2桁の16進数

[\da-fA-Fa-f]{2}

16進数は簡単で、0-9までの数かa-fまでの文字となります。大文字も許容します。

カラーコード

#([\da-fA-Fa-f]{6}|[\da-fA-Fa-f]{3})

色コードは16進数の正規表現がわかればそれの繰り返しで表現できます。ただし6桁の場合と3桁の場合があるのでそれぞれにマッチさせます。

XML/HTMLのタグ

<([A-Za-z]{1}[A-Za-z0-9]*)>.*</\1>

後方参照(一致したパターンを記憶しておき、後で使用すること)を使えば任意のXMLタグに対してマッチさせることができます。HTMLでも同様です。
HTMLからリンク先のURLとテキストを抽出することもできたりします。

クレジットカードの番号

(4\d{12}(\d{3})?)|(5[1-5]\d{14})|(3[47]\d{13})|(3(0[0-5]|[68]\d)\d{11})|((6011|65\d{2})\d{12})|((35\d{2}|2131|1800)\d{12})

クレジットカードの番号にはカード会社ごとに決められたプレフィックスが割り当てられています。
wikipedia を確認すれば以下のような規則があります。 これらの規則のいずれかにマッチする正規表現が上の例です。

カード会社 プレフィックス等の規則
VISA 「4」から始まる16桁(あるいは14桁)
MasterCard 「51、52、53、54、55」から始まる16桁
American Express 「34、37」から始まる15桁
Diners Club 「300-305、36、37」から始まる14桁
Discover 「6011、65」から始まる16桁
JCB 「35、2131、1800」から始まる16桁

参考URL

C#カテゴリの最新記事