ここから本文です

HTML を正規表現で解析する際に開始タグと終了タグをペアで扱いたい

uni********さん

2012/9/718:27:51

HTML を正規表現で解析する際に開始タグと終了タグをペアで扱いたい

HTML を正規表現のライブラリーを使って解析しています。
解析対象の HTML としてつぎの2とおりの入力がありうるのですが、これを簡潔に解析できる正規表現のパターンを教えてください。この中の "12,345" を取得したいです。

(1) "<TD><FONT color=#ff0000>12,345</FONT></TD>"
(2) "<TD>12,345</TD>"

今は、
"<TD>(<FONT color=#ff0000>)?([0-9,]+)(</FONT>)?</TD>"
のようなパターンを使っていますが、これだとつぎの点が不満です。
・HTML の開始タグ(<FONT>)と終了タグ(</FONT>)の対応が考慮されていないので、なんとなく気に入らない。開始タグと終了タグをペアで扱えるようなパターンの書きかたってないでしょうか?
・カッコを3つも使ってしまっているので、複雑なパターンになるとカッコの数が膨大になり、これもなんとなく節約できるなら節約したい。

なお、開発環境は Visual C# 2010 で .NET に標準の Regex クラスを使っていますが、とくにこの環境に限定せず正規表現全般のご回答をお寄せください。よろしくお願いいたします。

補足質問があいまいだったので補足します。
・(1)と(2)以外はエラーとして弾きたいです。たとえば "<TD><FONT color=#00ff00>12,345</FONT></TD>" のように色が違うだけでも弾きたいです。(数値は 12,345 以外でも受け付けます。カンマは数値の3桁毎の区切りの意味です。)
・基本的に質問は正規表現のパターン文字列に関してだと思ってください。正規表現で解析した後に、プログラミング言語で後処理をすることは想定していません。

閲覧数:
934
回答数:
2
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

obo********さん

2012/9/807:28:43

こんな感じでどうでしょうか。



public partial class Form1 : Form
{
private string STR_TD = "<TD>12,345</TD>";
private string STR_TD_FONT = "<TD><FONT color=#ff0000>12,345</FONT></TD>";

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Regex r01 = new Regex("(?:<TD><FONT\\s+color=#ff0000>)(?<data>[\\d,]+)(?:</FONT></TD>)", RegexOptions.IgnoreCase);
MatchCollection m01 = r01.Matches(STR_TD_FONT);

//this.textBox1.Text += r01.IsMatch(STR_TD_FONT).ToString() + "\r\n";

foreach (Match m in m01)
{
this.textBox1.Text += m.Groups["data"].Value + "\r\n";
}

Regex r02 = new Regex("(?:<TD>)(?<data>[\\d,]+)(?:</TD>)", RegexOptions.IgnoreCase);
MatchCollection m02 = r02.Matches(STR_TD);

//this.textBox1.Text += r02.IsMatch(STR_TD).ToString() + "\r\n";

foreach (Match m in m02)
{
this.textBox1.Text += m.Groups["data"].Value + "\r\n";
}

}
}

質問した人からのコメント

2012/9/13 11:56:16

みなさまご回答ありがとうございます。後方参照の番号数を節約するには (?: を使えば後方参照不要を明示でき、(?<foo> を使えば番号ではなく名前でアクセスできるんですね。今まで知らなかったので助かりました。

ベストアンサー以外の回答

1〜1件/1件中

spa********さん

2012/9/718:44:09

javascriptなら、こんな感じ

取得したいデータの形式が固定:
sampe.js - 名前付けて保存すれば、ファイルアイコンクリックで確認か
-------------------------------------------------------
var t = "<TD><FONT color=#ff0000>12,345</FONT></TD>";
WScript.Echo( (t = t.match(/[0-9]+,[0-9,]+/g))? t.join(', ') : 'NULL' );
-------------------------------------------------------

取得したいデータの形式がサダマラズ:
sampe.js - 名前付けて保存すれば、ファイルアイコンクリックで確認か
-------------------------------------------------------
var t = "<TD><FONT color=#ff0000>12,345</FONT></TD>";
WScript.Echo( (t = t.replace(/<[^>]+>/g,' ').split(/\x20+/)) ? t.join(', ') : 'NULL' );
-------------------------------------------------------

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる