• ベストアンサー

正規表現

正規表現で <Title > RAIN</Title> の <Title >~</Title> や <Param Name = "Name" Value = "RAIN" /> の "~" といったタグや記号の間の文字列を取り出すにはどのように記述したらよろしいのでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いします。

  • Perl
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.1

こんばんは。取り出したい文字列は英単語が主でしょうか? それなら正規表現は |<Title >(\w+?)</title>| |<Param Name = "(\w+?)" Value = "(\w+?)" />| のようになると思います。別に「//」でなくとも構いません。 取り出したい文字列に他の記号も入るようでしたら、 「\w」を「[^<>]」(No.1)や「[^"]」(No.2)にしてください。 「+?」は「+」でもいいかもしれないけど、念のため。 マッチした文字列は順に $1(, $2,...) に入ります。 あとは以下のようにループを回して $1(,$2,...) を処理すればよろしいかと。 while ($str =~ $re) # $re は正規表現オブジェクト、$str == $_ なら「$str =~」は省略可能 { print $1; }

tanicchi
質問者

お礼

ご返答ありがとうございます。 分かりやすい解説ありがとうございます。 nightowlさんの方法でタグや" "の中のアルファベット文字列を抜き出すことが出来ました。 しかし、全角文字列をこの方法では抜き出すことが出来ません。出来れば日本語全角文字列も同じように抜き出すことをしたいと思うのですが、それは可能な事なのでしょうか? \wといった全角文字列をあらわすメタキャラクタなどは無いと思うのでその場合どのように表現すればよろしいのでしょうか? ご存知でしたら教えてください。 よろしくお願いします。

その他の回答 (3)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.4

こんな感じである程度は取得できますが、もし、HTMLのparseをしたい場合、正規表現で行うことは基本的に考えないほうが良いでしょう。 m{<(\w+)(.+?)(?:/>|>(.*?)</\1>)}gos; ($tag,$val) = ($1,$3); (%elem) = $2 =~ /(\w+)=["']?(.+?)["']?/ if $2; もし、PerlでHTMLのparseを行いたい場合、moduleを使用することをお勧めします。

tanicchi
質問者

お礼

お返事が遅くなってしまって申し訳ございません。 無事に処理を行うことが出来ました。 正規表現を使いこなすのは大変ですが、これから使いこなせるようにもっと勉強していきたいと思います。 ありがとうございました。

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.3

訂正です。「|~|」は「m|~|」と前に m を置いてください。失礼しました。

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

ちょっと勘違いしていましたでしょうか? タグの種類によらず、「<Title > RAIN</title> 」のような開始タグから終了タグまでの 一連の文字列を切り出すには、 |<[^>]+>\w+</[^>]+>| とすればいいでしょう。その上で、真ん中の文字列を改めて下の手順で切り出してください。

関連するQ&A

  • 正規表現で詰まっています。

    こんにちは。 今、正規表現で困っています。 ファイルの中身 <meta name="description" content=""> <title> B'zのサイトへようこそ </title> 上記のようなhtmlのソースなのですが、以下のように変換できるように正規表現を考えましたが、できませんでした。 変換したい表現 <meta name="description" content="B'zのサイトへようこそ"> <title> B'zのサイトへようこそ </title> titleタグで囲まれた文字を、metaタグのcontentの中に入れたいのです。 とても困っています。どなたかご教授下さい。よろしくお願いいたします。

  • |。ってなんですか? 正規表現

    正規表現の学習中です。読んでいる本の中に次の式がありました。  (?<=^|。)[^。]+。 日本語の文章の中から一文を抽出するための正規表現です。  。以外の文字がダーッと連なった後に。が来る文字列 とのことです。  [^。]は。以外の文字  +はそれが1個以上ある ですから  [^。]+ は  。以外の文字が1個以上ある という意味です。 その後に。が付きますから、  [^。]+。 だけで  。以外の文字がダーッと連なった後に。が来る文字列 ということになります。 では  (?<=^|。) の意味は何でしょう。  (?<=なんたら) は後方参照を意味しますから、 ^|。 のすぐ後に [^。]+ が続くと言いたいのでしょうか。 だとすると  ^|。 が問題です。  ^もしくは。 という意味なら、^は正規表現で記号として使われている文字ですから、  \^|。 と表現されそうなものです。 それに、。は文末でしか利用されない文字ですから、これに注目して検索を行うというのは理解できますが、^は日本語でなんら特徴を持つ文字ではありません。  ^もしくは。 という理解は間違いでしょう。 それでは^を記号として考えるとして、その前後を[]で囲んでいないから、この^は文字列の先頭を表すのでしょうか。そうすると件の正規表現は  先頭の|。のすぐ後から。以外の文字が連なった後に。が来る文字列 という意味になります。日本語の一文を抽出する正規表現という解説にかなり近づいてはいます。 しかし  |。 とは一体何? |はorを意味する記号ですが、  何とか or 。 という意味でしょうか。 でも「何とか」は「何とか」なりに何か文字表現がなされていても良さそうですし、それに  先頭の「何とか」または。のすぐ後から・・・ という解釈は意味不明。  |。 はどのように解釈すべきなのでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • PHP5の正規表現でうまくマッチできない

    PHP5の正規表現で文字列中の独自タグをパースしようとしていて、 うまくいかず困り果てています。 正規表現パターンは、/<tag>.*<\/tag>/ 対象文字列は、<tag>こんにちは</tag><tag>こんばんは</tag> preg_match_all('/<tag>.*<\/tag>/', '<tag>こんにちは</tag><tag>こんばんは</tag>', $result) でマッチした文字列は、 $result[0]:<tag>こんにちは</tag> $result[1]:<tag>こんばんは</tag> となることを期待しているのですが、 実際は、 $result[0]:<tag>こんにちは</tag><tag>こんばんは</tag> となりました。 <tag>タグの間に入る文字列長、文字列フォーマットは不定です。 どうすれば期待通りの振る舞いに出来るでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

  • 正規表現  マッチさせれない C#

    下記のもの全体にマッチさせる表現を考えていたのですが、 どぉしても思いつきません。 まだまだ正規表現についてわかっていないのでご教授いただけないでしょうか。 /// <summary> /// メソッド1 /// </summary> /// <param name="Out">1:入力文字,2:出力文字)</param> /// 文字列     の部分は行が増えたり減ったりするので /// と文字列と改行文字で1つのくくりにして それを任意の回数繰り返しでマッチさせようとしています。 ([/// .*] \r\n)*   (///[.<>/]* \r\n)*  など試しましたがマッチしません。 そもそもこのようなものをマッチさせること自体無理なのかもしれませんが その点も含めご教授お願いいただけますでしょうか。言語はC#です

  • 正規表現について

    正規表現について 特定文字列の前にある文字列があった場合、はじくようにしたいのですが、 どのように記述すればよいでしょうか。 例えば、さしすせそ の前に かきくけこ があった場合のみはじきたいです。 ○ かきくけこ ○ かきくけこあいうえお × かきくけこさしすせそ × あいうえおかきくけこさしすせそ ○ あいうえおさしすせそ ○ さしすせそ よろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現で

    正規表現で、英大文字と記号だけからなる文字列、を表すにはどうすればよいでしょうか。言い方を変えると、とにかく英小文字は含まないという事なんですが… [^a-z]+ かなと思ったのですがダメでした。 123#ABC : OK 123#aBC : NG みたいな感じです。 よろしくお願いします。

  • 正規表現について

    変数の文字列を範囲指定して削除しようとしています。 正規表現を使って範囲指定したいのですが、うまくいきません。 <span class="shimei"> ~ </span> というのは正規表現でどのように書くのでしょうか? $name = mb_ereg_replace("<span class=\"shimei\">.*</span>","",$name); これはどこが間違っているのでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現について

    たくさんあるhtmlファイル内に特定の条件に該当するファイルを探したい場合の正規表現で、 <title>から</title>の間に「.jpg」や「%」といった特定の文字列を含んだ行を検索したいのですが、どのように書いたら良いでしょうか? お手数ですが、よろしくお願い致します。

  • 正規表現で( , -, ] を表すと。

    こんばんは。お世話になります。 正規表現を使ったプログラミングをしているのですが、一般に、) や、[ や - は正規表現の記号として使われますよね。 この文字を正規表現で検索したい時には、どうすればよいのでしょうか?. 誰か分かる方は教えてください。よろしくお願いします。

専門家に質問してみよう