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

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

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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサクラエディタでの正規表現使い方をお教えください。

 次のようなテキストがあり =より前を削除したいのです
Range("A1").ColumnWidth = 6.5
Range("B1").ColumnWidth = 6
Range("C1").ColumnWidth = 7
Range("D1").ColumnWidth = 6.88
Range("E1").ColumnWidth = 6.25
置換え後は=より後の文字だけにしたいのです
6.5
6
7
6.88
6.25
のように
宜しくお願い致します。

Aベストアンサー

アバウトな書き方をするならば
^.*\s=\s

もうちょっとまじめに書くと
^Range\(\".*\"\)\.ColumnWidth\s=\s

記号等の補足です。
^ 行の先頭
. 何か一文字
* 直前の文字の繰り返し
\s スペース
() ". などは制御文字になるため\をつけてエスケープします。

Q正規表現?の置換方法について!(以降削除等)

置換方法についてお詳しい方よろしくお願いいたします。

現在行いたいことは、ある対象とする記述以前、または以降の内容を削除したいと考えております。

具体的には、仮に<div id="hogehoge">とあったとします。

この場合、これ以前の記述を全て削除の置換を行いたいと思っています。
どんな記述があっても、<div id="hogehoge">の記述以前は全削除という置換です。

また、これは以前なのですが、この記述が終わったマーク、こちらも例えばですが<!--//hogehohe-->という記述終了を指定するコメントがあったとします。

その場合、<!--//hogehohe-->以降の記述は全て削除という指定を行いたいと思います。

伝わりますでしょうか。。。

何かを対象にする置換は調べたところ見つかったのですが、対象をもとに以前、以後という指定での置換が分かりません。><

お詳しい方いらっしゃいましたらアドバイスを頂けないでしょうか。

宜しくお願いいたします。

Aベストアンサー

notepad++ で確認
http://notepad-plus-plus.org/

CTRL+H または メニュー/検索/置換 から「置換」のダイアログを開き

検索文字列: ^.+(<div id="hogehoge">)
置換文字列: $1
検索モード: 正規表現
. matches newline: チェックを入れる (ファイル先頭まで削除する場合)
. matches newline: チェックしない (同じ行の頭まで削除する場合)
置換ボタンを押す
にて「以前の記述を全て削除」ができます

検索文字列: (<!--//hogehoge-->).+$
なら「以降の記述は全て削除」です

Q正規表現について(最後にマッチした以降のデータ取得)

以下の文字列から、最後の「\」以降の文字列を取得する方法を
教えていただけますでしょうか。

D:\PROGRAM\ANALYZE\LAN\data0123.dat

この文字列から、「data0123.dat」を取り出したい。
「data0123.dat」の部分は、拡張子含めていろいろ変わります。

よろしくお願いいたします。

Aベストアンサー

もっとスマートな式があるかもしれませんが
my $S = 'D:\PROGRAM\ANALYZE\LAN\data0123.dat';
## 正規表現
$S =~ m/.*\\([^\\]+)$/;
print $1;
ただし、ファイルパスを見るとDOS(Windows)環境のようですので環境はShift-JIS。
全角文字が混ざった場合には正規表現が正常動作する保障がありません。
正規表現の練習なら良いのですがこの程度の処理なら組み込み関数使った処理のほうが効率が良いと思います。
## 組み込み関数
print substr($S,rindex($S,"\\")+1);
ほかにも書き方はあります。

Q正規表現で最初にマッチしたものだけを選択する方法

秀丸の正規表現を用いて「その行で最初にマッチした単語」だけを取得したいのですが可能でしょうか

一例をあげますと、
検索文字列:ももりんごみかんももりんごみかん
とあるとき、左の「りんご」だけを「なし」に置換したいという希望です。

Aベストアンサー

> ついでといっては恐縮ですが、(?\2)という部分がどのような意味なのか教えて
これより前の部分で、() で囲まれた部分の 2 つ目のみにヒットさせる
という意味になります。詳細は、HmJre.dll のヘルプをご覧下さい。
秀丸エディタのヘルプの正規表現の項目からも辿れます。

QJavaScriptで文字列の特定文字以降を取得する方法

変数 url に以下のような文字列が代入されています。
var url='http://www.example.com?id=2&page=3';

ここから?以降の文字列だけを取得したいのですが、どのようにすれば良いのでしょうか?
「id=2&page=3」←このような結果が欲しいです。

ブラウザのurlから直接?以降を取得するには location.search を使えば良いというのは調べてわかりましたが、変数に文字列としてurlが代入された場合の方法がわかりません。

ご回答よろしくお願いいたします。

Aベストアンサー

文字列から抽出するのであれば、indexOfを使うか正規表現かでしょうね
深く考えなければ前者、複雑なデータを取りたいなら後者でしょうか

<script>
var url='http://www.example.com?id=2&page=3';
if(url.indexOf("?")>=0){
var str1=url.substring(url.indexOf("?")+1,url.length);
}
document.write(str1+"<br>");

var reg=new RegExp("\\?(.+?)$");
if(url.match(reg)){
var str2=url.match(reg)[1];
}
document.write(str2);
</script>

Qvlookup関数で検索値を含む文字列を検索する方法

vlookup関数で例えば E1のセルに=vlookup(D1,A:C,3,false)とした場合、D1が佐藤であれば、A列に「佐藤」がある場合には当然、「佐藤」がある行の3列目の値が返されますが、「佐藤」はなく「佐藤A」や「A佐藤」がある場合にもこれらがある行の値を返して欲しいのですが、いい方法はありませんでしょうか。*を使ってできると思ったのですがうまくいきません。上記例で、=vlookup("*佐藤*",A:C,3,false)とすればできますが、*佐藤*の部分はD1の引用を利用したいのです。
 よろしくお願いします。

Aベストアンサー

=VLOOKUP("*"&D1&"*",A:C,3,FALSE)

Q正規表現でAND検索はできるのでしょうか

正規表現でAND検索はできるのでしょうか?

現在ASPでデータベースのデータを検索しようとしているのですが,検索エンジンみたいに複数の語をスペースで区切って入力して,データを絞り込んで表示したいのです。

OR検索みたいにそれぞれの語を"|"でつなぐというようなやり方があるのでしょうか?
それとも一つ一つの語で検索を繰り返すという方法しかないのでしょうか?

ご存知の方,ご教授ください。

Aベストアンサー

&&でつながれたらいかがですか?

(?=.*stat)(?=.*ate)はAND検索という意味ではありません。
statedのようにstatとateを重複して含む単語にマッチするという意味です。

普通はこんな回りくどいことはせず、
/stat/ && /ate/
で済ませると思います。
(もしくは単純にループでまわしていくとか)


foo.*bar|bar.*foo
も、2語程度までが限界ですよね。
10語分繋げることを考えると気が遠くなります。
(記述も処理時間も)

言語によってはさらに処理を短縮できるような
特有な構文がありますから、調べてみればよろしいかと思います。

Q正規表現。行頭が○○以外にマッチさせたい。

正規表現を勉強しています。行頭がxyzという文字列以外をマッチさせたいと思っています。行頭にマッチさせるには"^xyz"と理解できます。[^xyz]とやるとx,y,z以外の文字列にマッチするのもわかります。ただ、これだと

123 xyz

の文字にもマッチしていまいます。行頭がxyzで続く文字列以外にマッチさせる正規表現はどうかけばよろしいでしょうか?

Aベストアンサー

パターンを使うんでしょうね。 → ^(?!xyz)
Excelマクロでの実験プログラム
Dim A, P$
Set A = CreateObject("VBScript.RegExp")
A.Global = True
A.IgnoreCase = True
P = "^(?!xyz)"
A.Pattern = P
Debug.Print A.Test("xyz123") '★(1)
Debug.Print A.Test("123xyz") '★(2)
(1)先頭が「"xyz"以外」という条件に反するのでFalse
(2)先頭が「"xyz"以外」という条件に合うのでTrue

http://msdn.microsoft.com/ja-jp/library/cc392020.aspx

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCELのセルが動かないです

普通は、矢印キーを押すと、セルが動きますよね。

今日、仕事中
矢印キーほ押してもセルが動かなくなりました。
画面は動きますがセルがついて来ないのです。
そのPCで使う場合どのエクセルも同様の動きです。

ツールバーあたりを設定する必要がありますかね。

Aベストアンサー

そのPCのScroll Lock (Scr Lk)キーが押されていませんか?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング