プロが教えるわが家の防犯対策術!

正規表現を使用し、複数のHTMLファイルのテーブルを
一括で抜き出そうとしています。

ファイルは 本文<table>残す部分</table>本文 となっています。
本文は各自異なる為、普通の置換え機能で、一気に削除できません。

調べてみた所、正規表現を使い、$`や$' を使うと、特定の文字列の
前や後を選択することができるようなのですが、具体的にどう使うか
がよく分からず、試行錯誤してみましたが、失敗してしまいました。

正規表現で、「より前」や「より後」を選択し、削除する方法が
ございましたら、教えて下さい。宜しくお願い致します。

A 回答 (6件)

正規表現は、不得手なのですが…



まず最初に、使用言語によって、正規表現の記述方法は違いますので、使用する文字が変わってきますし、オプションなども違うでしょう。
言語による違いは
 http://www.kt.rim.or.jp/~kbk/regex/regex.html

なので、ここから後は雰囲気のみで読んでください。
------------------------------------------------------
最初の<table>が出てくるまで、最後の</table>以降などは
 /^(.*?)<table>/ 、 /<\/table>(.*?)$/
などで対応できるかと思います。
<table>タグに属性が設定されている可能性を考慮するなら、「<table」までのほうが良いのかも。また、タグは大文字の可能性もあるりますし、途中に改行が含まれる可能性もあるので、オプション指定した方が良いでしょう。

一方で、複数のテーブルがある場合、例えば…(**は文字列)
    **************
<table>*************</table>
    **************
<table>*************</table>
とか、
    **************
<table>*************
<table>*************</table>
    **************</table>
みたいな場合、あるいはこれらの複合形なども考えると
テーブル以外を消すよりも、テーブルを抜き出した方が良いかも。
 /(<table>.*?<\/table>)/
この場合でも入れ子のテーブルをどう処理するのかは、考えねばなりません。
(先に、内側を記号などに置き換えてから外側を検索するとか、あるいは一気に全部マッチさせるとか…)

さらには、コメント行やスクリプトなどの中に、これらのタグが出てくる可能性まで考えると、なかなか一筋縄ではいかなくなりますね。


おまけ HTMLタグの正規表現及びコメントタグの正規表現
 http://www.din.or.jp/~ohzaki/perl.htm#HTML_Tag
    • good
    • 0
この回答へのお礼

大変詳しいご回答を下さり有り難うございました。
まったく無知な状態から、少し正規表現の特徴が分かりました。

Dreamweaver の機能だと、何故かソースに適用/正規表現を使用モード
にしても「マッチするデータがありません」となっていました。ので、
他のエディタ(jedit X) に変え、構文を Perl の設定にしてみたところ、
ご教授頂いた ^(.*?)<table> で、テーブル前を一括削除することが
できました。

テーブル以降の削除には、まだ失敗してしまいす。<\/table>(.*?)$
で検索すると、(前後の/ありでも、) 何も選択されない状態です。

今回の作業は、幸い、テーブルが一つあるだけのファイル群なので、
削除する方法にしようと思います。でもとても参考になります。

引き続き、テーブル以降の選択について、ご教授頂ける方
いらっしゃいましたら、宜しくお願いいたします。

お礼日時:2009/08/31 23:19

こんばんは。


DreamweaverCS3で試してみましたが、
([\d\D]*<table>)|(</table>[\d\D]*)
で置換したところ、tableタグの前後を削除できました。
自分もまだ正規表現を勉強し始めたばかりなので、
もっとスマートなやり方があるかもしれませんが、
置換はできます、ということでご報告します。
tableタグの前の部分はすでに削除されたようですので
心配は不要かと思いますが、
#2さんのおっしゃるように、tableタグに属性がある場合は
<table>を<tableにすると検索に引っかかってくれます。
    • good
    • 0
この回答へのお礼

こんばんは、ご回答有り難うございます。

おお、無事成功しました!とても助かりました。
数百個分のファイルだったので・・


正規表現やプログラミング全般は、縁のない世界だと
思っていたのですが、皆さんのアドバイスも含め
必要性を強く感じる為、私も真剣に勉強をしようと思います。

本当に有り難うございましたm(_ _)m

お礼日時:2009/09/01 21:44

#2です。



>テーブル以降の削除には、まだ失敗してしまいす。

え~~っと。
 ・・・・・・
すんません。
使用言語にもよりますが、メタキャラの「.」には改行が含まれない可能性もあります。
なので、\s*を付け加えないとうまくないかも…

ぅんっ?
・・・・ってーことは、前半のやつも [.\s]*? じゃないとダメっつーことかな?

むぐぅ・・このあたりがまさに「不得手」な理由ですぅ ^^;ゞ
    • good
    • 0
この回答へのお礼

再びご回答有り難うございますm(_ _)m

「.」に改行が含まれない場合もあるのですね。参考になります。
何故前半だけ成功するのか、私も謎です・・

でも相談にのって頂き有り難うございました!

お礼日時:2009/09/01 21:39

私も正規表現は苦手なのですが、必要に迫られ同じような処理をするアプリケーションを作成しています。

私のアプリケーションは「HTML文の中で、ユーザーが注目する箇所を監視し、変更時に通知する」ものです。要するにHTML文の特定箇所を切り抜く必要があるわけです。
監視するURLは、例えば「教えて!goo」で
http://oshiete1.goo.ne.jp/c260.html
を見て、最新の質問をピックアップします。
具体的方法は、正規表現で「前置マーク」「ターゲット」「後置マーク」を指定し、最初は「前置マーク」+「ターゲット」+「後置マーク」に該当する部分を切り取り、さらに「前置マーク」と「後置マーク」に該当する部分を削除します。
正規表現は
「前置マーク」:qa[0-9]+\.html">
「ターゲット」:.*
「後置マーク」:</a>
です。今テストしたところ「http GETに混入されるこのデータは何でしょうか」が抽出されました。
もちろん対象によりこの正規表現は変更する必要があります。多少参考にならないでしょうか?
    • good
    • 0
この回答へのお礼

アドバイス下さり有り難うございます。参考になります。
私は、こういった処理の考え方に慣れる必要がありそうです。
とても便利そうなソフトですので、心待ちにします。

お礼日時:2009/09/01 21:36

私も「table 要素を残してそれ以外を捨てる」という方針の方が早いような気がします>#2.


まあ, 「ネストしている」場合には本来正規表現では表すことができないんですけどね.
    • good
    • 0
この回答へのお礼

アドバイス下さり有り難うございました。

お礼日時:2009/09/01 21:26

まず, あなたが使っている言語は書いた方がいいと思う. 次に, 試行錯誤の内容, つまり


・どのようなデータに対して
・どのような結果を期待して
・どのように書いたところ
・どのようになってしまったのか
は極力書くべきです.
    • good
    • 0
この回答へのお礼

申し訳ありません、正規表現は、全て共通なのかと思っていました。

Dreamweaver の 検索置換機能を利用し、データの種類・目的は
書いた通りです。試行錯誤は、$`<table>などとして空白に置換えようと
して「検索項目が見つからない」となりました。

お礼日時:2009/08/31 18:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!