正規表現でおたずねします。


以下の文字列があった場合、
$lines = '<a href="abcdefg">';
$lines =~ m /href="(.*?)"/ ;

でマッチしてabcdefgを抽出できますが、

$lines = '<a href="abcdefg" target="_blank">';

の場合、
「abcdefg」を抽出する場合、
「abcdefg" target=」を抽出する場合、
「abcdefg" target="_blank」を抽出する場合など、

2番目、3番目の「"」までをマッチさせる場合のいい方法はないでしょうか?

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:2007/09/21 13:17:38
  • 終了:2007/09/28 13:20:04

回答(4件)

id:toohigh No.1

toohigh回答回数291ベストアンサー獲得回数372007/09/21 14:28:27

ポイント23pt

元の書き方に一番近くて一番単純そうなのは、こんな感じでしょうか。

$lines =~ m /href="(.*?".*?)"/ ;

もうちょっとだけ汎用性を持たせるなら、

$lines =~ m /href="((.*?"){2}.*?)"/ ;

これだと " が二つ分含まれる形で結果が返ります。



最大一致で最初の " から最後の " の間を取る、ならこれでいけるかと。

$lines =~ m /href="(.*)"/ ;

http://www.kent-web.com/perl/chap7.html

id:zachouR

ありがとうございます。

さっそく使わせていただきます

2007/09/21 16:27:45
id:samejima No.2

samejima回答回数92ベストアンサー獲得回数82007/09/21 14:30:24

ポイント23pt

> 「abcdefg」を抽出する場合、

> 「abcdefg" target="_blank」を抽出する場合

これはコメントで既出。


> 「abcdefg" target=」を抽出する場合、

$lines = '<a href="abcdefg" target="_blank">';
$lines =~ m/href="(.*?".*?)"/ ;
print $1, "\n";
id:zachouR

ありがとうございます、非常に簡単につかえそうですね!

2007/09/21 16:28:23
id:wizemperor No.3

wizemperor回答回数379ベストアンサー獲得回数522007/09/21 14:45:43

ポイント22pt

1回のマッチで1番目~n番目全てにマッチするのはかなり複雑になりますし、できるかどうかちょっとわかりません。

代わりに、

$lines = '<a href="abcdefg" target="_blank">';
$lines =~ m/<a ((?:[^"]*"[^"]*){1})">/i;  # 2番目の " までマッチ

# $lines =~ m/<a ((?:[^"]*"[^"]*){2})">/i;  # 3番目の " までマッチ
# $lines =~ m/<a ((?:[^"]*"[^"]*){3})">/i;  # 4番目の " までえマッチ

こんな感じでどうでしょう?


「{1}」の部分が、最初のダブルクォーテーション(1つ目)から数えて、何番目のダブルクォーテーションまでマッチさせるかになります。



結果としては、

「{1}」の場合、「href="abcdefg」が返ります。

「{2}」の場合、「href="abcdefg" target=」が返ります。

「{3}」の場合、「href="abcdefg" target="_blank」が返ります。


href属性だけ特別扱いするとややこしいのと、実際には属性の並び方は色々だと思うのでこうしてみましたがいかがでしょう。

シングルクォーテーションに対応する場合はもう少し複雑になりますが、応用してみてください。


http://q.hatena.ne.jp/answer

id:zachouR

こんな、やりかたもあるんですね、非常に勉強になりました。

2007/09/21 16:28:42
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402007/09/21 14:49:54

ポイント22pt
$lines = '<a href="abcdefg" target="_blank">';
$lines =~ m /href="(.*?)"(?:(.*?)")(?:(.*?)")/;
printf "first : %s\n" , $1 ? $1 : "unmatch";
printf "second: %s\n" , $2 ? $2 : "unmatch";
printf "third : %s\n" , $3 ? $3 : "unmatch";

正規表現 [Perl講座 -Smart]

id:zachouR

いつも、ありがとうございます。

参考にさせていただきます。

2007/09/21 16:29:00
  • id:yaica
    こんな方法でいいですか?

    #!/usr/bin/perl -w

    $lines = '<a href="abcdefg" target="_blank">';

    # abcdefg を抽出する方法 最小マッチ 
    $lines =~ /href="(.*?)"/ ;
    print $1."\n";

    # abcdefg" target="_blank を抽出する方法 最大マッチ
    $lines =~ /href="(.*)"/ ;
    print $1."\n";

    結果

    abcdefg
    abcdefg" target="_blank
  • id:zachouR
    ありがとうございます。

    いろいろやり方があるみたいでびっくりしました。

    一番あう方法を試してみたいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません