• 締切済み

正規表現のパターンマッチ

配列の中から特定の文字を取り出す処理がうまくできません @test = ("aaa","bbb","t=1","v=3"," test:", " test:") 上記のような配列があったとして 一文字目がaからzで二文字目が=のものを取り出す処理と 一文字以上の空白の後ろにtest:があるものを取り出す処理は どのようにすればいいのでしょうか? 下記のような感じで書いたのですがうまくいきません @test = ("aaa","bbb","t=1","v=3"," test:", " test:") my $test = "test:"; foreach( @test ) { if( $_ =~/^[a-z]+k/) { print $_; } if( $_ =~/^\s+$test/) { print $_; } } よろしくお願いします

  • Perl
  • 回答数2
  • ありがとう数0

みんなの回答

回答No.2

> 一文字目がaからzで二文字目が=のものを取り出す処理と my @foo = grep { /^[a-z]=/ } @test; >一文字以上の空白の後ろにtest:があるものを取り出す処理は my @baa = grep { /^\s+test:/ } @test;

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

$_ =~/^[a-z]+k/ の k はどこから来たのですか? $_ =~/^\s+$test/ の $ はどこから来たのですか?

関連するQ&A

  • 簡単でお恥ずかしいのですが・・正規表現

    文字列:aaa="あいうえお" bbb から あいうえお だけ、抽出したい $a= "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)\" bbb",$a,$b);  print "$b[1]"; ではうまいてきません。 $a= "aaa=\"あいうえお\" bbb"; mb_ereg("aaa=\"(.*)bbb",$a,$b);  print "$b[1]"; では、 あいうえお" になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • ある条件で一致した場合、配列に代入したい

    foreach(0..$#DataLines){ my@aaa= split(/<>/,$DataLines[$_]); if($FORM{No} eq @aaa[1]){ unshift(@bbb,"$DataLines[$_]"); } } print F "@bbb"; した時に配列@bbbにif($FORM{No} eq @aaa[1]){ で一致した場合、その時の配列を全部@bbbに代入したいのですが、最後のしか入らないようなので、これを全部入れるにはどうすれば良いかご教授願えませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • すべてにパターンマッチしてしまうのはなぜ?

    以下のようなスクリプトを書いた時に my @list = ('ab', 'cd', 'efg', 'hijk'); foreach my $line (@list){ #print "$line\n"; if ($line =~ m/ ^a| ^e| /x){ print "$line "; }} 標準出力は ab cd efg hijk となり、@list内の要素すべてにマッチしたことになってしまいます。 理由がわからずごちゃごちゃといじっていると、検索部分を =~ m// としても全く同じことになります。 これは、どの配列の要素も空(くう?)を含むためにヒットしてしまう・・・ ということなのでしょうか? どのように理解すれば良いのでしょうか?基本的な質問で申し訳ございませんが、どなたかよろしくお願い致します。

    • ベストアンサー
    • Perl
  • 正規表現の中の変数の中の演算子

    perlで正規表現を使おうとしています。 確認したい文字列は変数にしており その文字列には「?」が含まれています。 ------------------------ $str = "文字列" $exp = "test?aaa=bbb"; if ($str =~ /^sss.*${exp}$/){ #do something } ------------------------ これだと、ヒットしません。。 $expを"test\?aaa=bbb"にすることもできません。 正規表現にはこだわりません。 どうしたら、うまくマッチングできますかね。。 なにか案があれば教えてください。

    • ベストアンサー
    • Perl
  • 配列を対象にして正規表現の置換、うまくいきません

    正規表現の置換ができませんのでお教え下さい。 @list= ('aaa', 'bbb', 'ccc'); $sentence = 'rrr bbb dddd eee aaa rrrr bbbb aaa'; foreach (@list) { $sentence =~ s/$_/あああ/g; } print $sentence; どうしてもエラーになります。 そこで \をつけて、$sentence =~ s/\$_/あああ/g; などとやってみても置換されません。 どこが間違えているのでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ''で囲まれていない文字列にマッチする正規表現

    下記のような文字列($str)に対して置換を行い、 my $str = qq{ AAA = BBB - 'CCC' }; $str =~ s/★正規表現★/sprintf("DDD(%s)",$1)/xmsge ; 変換後 $str = DDD(AAA) = DDD(BBB) - 'CCC' ; を実現する★正規表現★を書きたいと思っています。  ・AAA,BBB,CCCは[\w]で構成される文字列です。 ですが、シングルクォーテーション('')で囲まれていない文字列にマッチする正規表現が書けなく困っています。 一度、シングルクォーテーションで囲まれているものも含めて全てDDD()をつけて、そのあとで、シングルクォーテーションを含むものは元に戻すことでやりたいことは実現できているのですが、1行で実現できる方法を探しています。 アドバイスよろしくお願いします。

    • ベストアンサー
    • Perl
  • Rubyの正規表現について教えてください

    配列に文字列を格納し、先頭が大文字または数字の文字列だけ別の配列に入れようとしています。 次のようにプログラムを作ったのですが、ifの行でエラーが出ます。 何が間違ってますか? mojiretu_array.each{|mojiretu| if mojiretu =~ [^a-z]\w+ mojiretu_out.push mojiretu end }

  • 正規表現中の()について

    正規表現中の()について 繰り返し正規表現を行い、マッチ部分を配列に入れる場合の疑問です。 今回、while文を使わずに書いてみようとしています。 #3個以上数字が連続していたら、配列へ入れる。…(1) my @data = ( $str =~ /\d{3,}/g ); #3個以上連続している、同じ文字を取り出して、配列へ入れる。…(2) my @data = ( $str =~ /(.)\1{2,}/g ); 1つめのほうは期待通りに動きました。 が、2つめは正規表現内の()で囲まれた範囲しか、配列に入ってくれませんでした…。 具体的には、$str='AAABBB'なら、 @data='A','B'になってしまいました。(AAA,BBBを配列に入れたい) たぶん、while文と$&を使えば書けそうだとは思いますが、 今回は、この書式で期待通りに動かす方法を知りたいです。 AAA,BBBを配列に入れるにはどのように書けばよいでしょうか? どうか、ご教授ください。 よろしくお願いします。

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

    すみません、前回「正規表現について」でお世話になりました者です。 前回の分は解決したのですが、それに関連してもう少し教えてください。 data.txt---------------------------------------- aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ test.pl----------------------------------------- #!C:\Perl\bin\perl use CGI; my $q = CGI->new; $q->charset('Shift_JIS'); print $q->header(-type => "text/html"); my $line=0; open(IN,"<data.txt"); open(OUT,">output.txt"); while(<IN>){ if ($line++==0){ $output1="$1" if/aaa(.*?)ccc/;} s/aaa(.*)ccc/$1/ if (?aaa(.*)ccc?); print OUT; } close(OUT); close(IN); print $output1; ------------------------------------------------ とすることで、得られたい結果である、 output.txt-------------------------------------- bbb aaadddccc aaaeeeccc ------------------------------------------------ IEでの表示-------------------------------------- bbb ------------------------------------------------ となりました。そこで今回教えていただきたいのは、 data.txt---------------------------------------- <空行> aaabbbccc aaadddccc aaaeeeccc ------------------------------------------------ というようにdata.txtのはじめが空行の場合にも、 上記と同じような結果を得たいです。output.txtの はじめは空行になっても構いません。得られる文字として、上と同じ結果がほしいです。どうしたらよいでしょうか?よろしくお願いします。

    • ベストアンサー
    • Perl
  • パターンマッチ

    The remained line is shown below. Outline Lab's file A and B ファイルの中身は上記のようになっています。 サブルーチンを作り、パターンマッチで1行目以外を新しいarrayに入れようとしています。 以下のように書きましたが、空白行を選択してしまいます。どうしたら目的のように動くようになりますか? 宜しくお願い致します。 use strict; my @new_line = skip(@input) sub skip { my @lines = @_; my @skip = ("Outline", "Lab\'s\sfile", "A\sand\sB"); foreach my $line(@lines) { my $word = join ("|", @skip); if ($word =~ /^\$line$/) { push @new_line, $line; } } return @nnew_line; }

    • ベストアンサー
    • Perl

専門家に質問してみよう