VB.NETにて正規表現の勉強をしています。


HTMLからTDタグで囲まれた部分を取得しようと思ったのですが、下記のパターンでは TDタグ間に別なタグ(例えば <br>など)があると取得できません。
どうすればよいでしょうか?

<TD[^>]*>(?<1>[^(<TD)]*)</TD>

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/12/18 02:50:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント35pt

<TD.*>(.*)</td>

で拾えない?

id:yamazakiis

グループ化したいんですよねぇ。

2006/12/11 03:18:03
id:tezcello No.2

回答回数460ベストアンサー獲得回数69

ポイント35pt

先ずは問題になっている正規表現がどういう事になっているか考えます。


<TD[^>]*>(?<1>[^(<TD)]*)</TD>

<TD[^>]*> <TD に > 以外の文字が0回以上続いた後 > が続いている
(?    ( が0または1回
<1>    必ず <1> が続いている
[^(<TD)]* ( < T D ) 以外の文字が0回以上
)     必ず ) が続いている 
</TD>   必ず </TD> が続いている

という事になると思います。

ひょっとすると、<1> の部分はVB特有の表現なのかも知れませんが、本来の正規表現では質問文にあるやりたい事とは合致しません。

これでTDタグ間に何もタグを含んでいない時にうまくいっているとしたら不思議です。

また、[^(</TD>)]は、</TD>以外の文字列という意味にはなりません。

○○以外の文字列と一致する正規表現はもの凄く難しい(長くなる)です。

こちらが参考になると思います。

http://www.kt.rim.or.jp/~kbk/regex/regex.html#CCLASS

うまくいかないのは、このような理由だと思います。

ですから、基本的に最初の回答者さんので問題無いと思いますけど。

最初の回答者さんのもTDタグの内側がグループ化されているハズですが、ダメなんでしょうか?

何をどうグループしたいのかを示していただければ、適切な回答が得られると思います。

<TD.*>の部分は質問者さんのように<TD[^>]*>の方が厳密でしょうね。

最後の</td>はタイプミスでしょう。

id:yamazakiis

なるほど、含まないってのは難しいんですね。

参考になりました。

ちなみに、

(?  は  ( が0または1回 ではありません。

2006/12/11 16:45:04
id:kn1967 No.3

回答回数2915ベストアンサー獲得回数301

ポイント10pt

> (?  は  ( が0または1回 ではありません。

?の直後に:あるいは=あるいは!が続いていないので0または1回が正解になりますけど、、、、


> [^(<TD)]*</p>

(または<またはTまたはDまたは)の何れか以外という表現になっています。


このように、パラメータ自体におかしな点があるので、元のデータを推測することが出来ません。

1/の回答は大雑把過ぎて済みませんでしたが、上記のような理由で2/の方も理解に苦しんでおられるようですし、他の閲覧しておられる回答者の方々も同じだと思いますので、具体的にどのような元データを準備しておられるのかを書いてみてはいかがでしょうか?

一人二回までなので、もう出てこれませんが、念のため .NETの正規表現のメタキャラクタリストのページを書いておきますので、参考にどうぞ。。。。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja...

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません