- 締切済み
perlの複数行マッチングについてです
perl初心者です、いまperlのプログラムを書いていてxmlのデータとのマッチングをしようとしているのですが <nanka> <hoge>4</hoge> </nanka> <data>1</data> <hoka>1</hoka> このような部分があった場合に </nanka> <data>1</data> ここの1のみを取り出したくてマッチングを考えているのですが /</nanka>.<data>(.*?)<\/data>/s; ではうまくいかず、困っています。 なにか良い方法、もしくはこのようなマッチングは不可能など ご意見いただければと思います。 よろしく御願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
整形式の XML文書 (平たく言えば「正しい XML文書」) であるための条件の 1つに「ルート要素が 1個だけある」というものがあります. ところがこの質問文にある形ではルート要素が 3個あります. つまりこれは整形式ではない (分かりやすく言えば「正しくない」) わけです. ルート要素をでっちあげて <root> <nanka> <hoge>4</hoge> </nanka> <data>1</data> <hoka>1</hoka> </root> とすれば整形式の XML文書になる. そうすれば, XPath で「nanka要素の直後の data要素」を指定するだけ.
- Tacosan
- ベストアンサー率23% (3656/15482)
「モジュールも使ってみたのですが、 二行に渡ってマッチした場合にのみダグの中の値取れなくて断念しました。。」 の意味が分からんのだけど (じゃあ 3行に渡った場合は取れるのか?), てきとうにルート要素をでっち上げて整形式の XML文書にすれば XML::XPath で取れるんじゃないかなぁ.
- kmee
- ベストアンサー率55% (1857/3366)
use feature qw(say) ; $_='<nanka> <hoge>4</hoge> </nanka> <data>1</data> <hoka>1</hoka> <chigai> <hoge>4</hoge> </chigai> <data>1</data> <hoka>1</hoka> ' ; if( /<\/nanka>.<data>(.*?)<\/data>/s ){ say $1; } これでちゃんと 1 と出力されます。 具体的に、どう「うまくいかず、困って」いるのですか? ・質問にある通り、</nanka>の/のエスケープ忘れで、エラーになっている →/をエスケープする。 あるいは、/を多用するパターンなら、 mを使って、デリミタを/でないものにすると便利です 例: mX<\/nanka>.<data>(.*?)<\/data>Xs http://perldoc.jp/docs/perl/perlop.pod#Regexp32Quote-Like32Operators ・<\/nanka>と<data>の間が「1文字」ではない。(CR+LFで改行されているファイルをそのまま読みこんでいる、改行が無い、末尾に空白がある、等) →事前に処理しておく(CRLFならCRを削除、末尾の空白ならs/\s+$//gm等) → . ではなく、 \s* にしてみる
お礼
ありがとうございます。 タグ中の値がとれなくて困っていました。 ご指摘頂いた通り、エスケープを忘れていたりと初歩的な部分がまだ直っていなかったことと どうもまだ正規表現の理解が足りないことがわかりました。 詳しい開設とサンプル、またサイトを教えていただきありがとうございます。
- t-okura
- ベストアンサー率75% (253/335)
/</nanka>.<data>(.*?)<\/data>/s; で / のエスケープが漏れているのは投稿時のタイプミスでしょうか ?
補足
いえ、ミスではありませんでした、エスケープをすっかり見落としていました。 ご指摘ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
XML を処理するならそれなりなモジュールを使った方がいいような気はするけど.... とりあえずどう「困っている」んでしょうか?
補足
モジュールも使ってみたのですが、 二行に渡ってマッチした場合にのみダグの中の値取れなくて断念しました。。 このxmlは <nanka> <hoge>4</hoge> </nanka> <data>1</data> <hoka>1</hoka> <chigai> <hoge>4</hoge> </chigai> <data>1</data> <hoka>1</hoka> というような部分もあって、</nanka>のあとのタグの場合のみ 値を取りたくて…
補足
すみません、ルート要素をでっちあげるとはどういうことでしょうか...? XML::XPathででも試してみます、ご指摘ありがとうございます。