• ベストアンサー

正規表現

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう