• ベストアンサー

正規表現で「より前」と「より後」

正規表現を使用し、複数のHTMLファイルのテーブルを 一括で抜き出そうとしています。 ファイルは 本文<table>残す部分</table>本文 となっています。 本文は各自異なる為、普通の置換え機能で、一気に削除できません。 調べてみた所、正規表現を使い、$`や$' を使うと、特定の文字列の 前や後を選択することができるようなのですが、具体的にどう使うか がよく分からず、試行錯誤してみましたが、失敗してしまいました。 正規表現で、「より前」や「より後」を選択し、削除する方法が ございましたら、教えて下さい。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

正規表現は、不得手なのですが… まず最初に、使用言語によって、正規表現の記述方法は違いますので、使用する文字が変わってきますし、オプションなども違うでしょう。 言語による違いは  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

yappaiides
質問者

お礼

大変詳しいご回答を下さり有り難うございました。 まったく無知な状態から、少し正規表現の特徴が分かりました。 Dreamweaver の機能だと、何故かソースに適用/正規表現を使用モード にしても「マッチするデータがありません」となっていました。ので、 他のエディタ(jedit X) に変え、構文を Perl の設定にしてみたところ、 ご教授頂いた ^(.*?)<table> で、テーブル前を一括削除することが できました。 テーブル以降の削除には、まだ失敗してしまいす。<\/table>(.*?)$ で検索すると、(前後の/ありでも、) 何も選択されない状態です。 今回の作業は、幸い、テーブルが一つあるだけのファイル群なので、 削除する方法にしようと思います。でもとても参考になります。 引き続き、テーブル以降の選択について、ご教授頂ける方 いらっしゃいましたら、宜しくお願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • kawacchi
  • ベストアンサー率83% (26/31)
回答No.6

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

yappaiides
質問者

お礼

こんばんは、ご回答有り難うございます。 おお、無事成功しました!とても助かりました。 数百個分のファイルだったので・・ 正規表現やプログラミング全般は、縁のない世界だと 思っていたのですが、皆さんのアドバイスも含め 必要性を強く感じる為、私も真剣に勉強をしようと思います。 本当に有り難うございましたm(_ _)m

すると、全ての回答が全文表示されます。
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.5

#2です。 >テーブル以降の削除には、まだ失敗してしまいす。 え~~っと。  ・・・・・・ すんません。 使用言語にもよりますが、メタキャラの「.」には改行が含まれない可能性もあります。 なので、\s*を付け加えないとうまくないかも… ぅんっ? ・・・・ってーことは、前半のやつも [.\s]*? じゃないとダメっつーことかな? むぐぅ・・このあたりがまさに「不得手」な理由ですぅ ^^;ゞ

yappaiides
質問者

お礼

再びご回答有り難うございますm(_ _)m 「.」に改行が含まれない場合もあるのですね。参考になります。 何故前半だけ成功するのか、私も謎です・・ でも相談にのって頂き有り難うございました!

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.4

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

yappaiides
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

私も「table 要素を残してそれ以外を捨てる」という方針の方が早いような気がします>#2. まあ, 「ネストしている」場合には本来正規表現では表すことができないんですけどね.

yappaiides
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

まず, あなたが使っている言語は書いた方がいいと思う. 次に, 試行錯誤の内容, つまり ・どのようなデータに対して ・どのような結果を期待して ・どのように書いたところ ・どのようになってしまったのか は極力書くべきです.

yappaiides
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A