• ベストアンサー

Perl正規表現わかりますか?

下記のPerl正規表現ですが、どんな意味か分かるでしょうか? $var =~ s!/([^/]+|~(\.\.))/\.\./!/!g 参考書も読んでみたのですが分かりませんでした(セットされている文字列にどんなマッチング、置換をしているのでしょう) お分かりの方いれば、よろしくお願いします。

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

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

逆にお聞きします。 これのどこがわからないのでしょうか? 少なくとも、この中には基本の表現しかないので、正規表現をかじった程度の方でも落ちついて考えれば初心者でも理解できるはずです。 少し難しい点は ! です。 よく s/old/new/ と「参考書」には載っていますが、実は、 / は それ以外の記号でも利用できます。今回のは /の代りに!を使った例です。 記号を変えると次のようになります。 ・/ に「区切り」としての意味がなくなり、「/という文字にのみ一致する」表現となります。 ・逆に、指定した記号(今回は!)には「区切り」としての意味が付くので、その特殊な意味を消すには\でエスケープする必要があります。 これは、パスやURLのマッチング等、 / をたくさん使用するときに、いちいち\/と書かずに済む、という利点があります。 ここまでわかれば 置換対象: $var 検索パターン: /([^/]+|~(\.\.))/\.\./ 置換文字列: / オプション: g だということがわかります。あとは、/が正規表現の区切りではなく「/という文字に一致」ということに気をつければ、参考書を見ながら調べられるはずです

kitt31
質問者

お礼

>少し難しい点は ! です。 まさしくここでひっかかってました。 親切な解説、ありがとうございました。

その他の回答 (1)

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

えぇと, まぁ「正規表現の意味」はそれでいいんですけど, ぶっちゃけ「これで何をしたいのか」が見えないっす>#1. 具体的には $var =~ s!/[^/]+/\.\./!/!g とどう違うんだっけなぁ, と.

kitt31
質問者

お礼

確かに、この表現は変ですね。 他人が書いたコードなので、何か特別な意味があるのかと思ってました。 回答ありがとうございました。

関連するQ&A

  • Perl正規表現(置換)

    Perlを用いてテキスト中の文字列 /^\d+$|^\d+\.[05]{1}$/ を、以下の文字列に置換したい場合、 うまくやる方法はないでしょうか? /^[0]+$|^[0]+\.[0]+$/ 正規表現を使いたいですが、 1つ1つエスケープしていくのはさすがに・・・ よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlの正規表現

    Perlの正規表現で質問です。 例えば、 "aabbccddee"と"cdde"という2種の文字列があるとして"cdde"だけを検索(または置換)したい場合の正規表現ってどのようにすればよいのでしょうか? いま、"cdde"で検索すると"aabbccddee"と"cdde"の2種類がヒットしてしまうのですが"cdde"だけヒットするような正規表現をどなたかご教示ください。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • Perlの正規表現

    Perlの正規表現である文字列に文字列STRINGが含まれないようにするには ^(?!.*STRING).+$ と書くとググったら出てきました. ですが,?!について詳しいことまで書いてるサイトはありませんでした. ?!は具体的にはどのようなことをするのでしょうか?

  • Perlで使える正規表現を教えて下さい。

    Perlで使える正規表現を教えて下さい。 半角英語で、小文字が3文字以上続いた後、大文字が来る場合、その大文字の右にスペースを入れる。 これをPerlで使える正規表現を教えて頂けないでしょうか? 例 $str = 'AaaAaaaBbbbbCccccDddBbA'; # Aaa Aaaa Bbbbb Ccccc DddBbA ちなみに、色々ネットで調べて試してみて、 $str =~ s/([a-z])([A-Z])/$1 $2/g; が最も近いコードになったのですが、2文字続いただけでもスペースが入り困っています。 宜しくお願い致します。

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

    Perlの正規表現について質問です. ■質問 aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd eee" aaa bbb ccc ddd eee "fff ggg hhh iii" というような,文字列が書かれているファイルがあるとします. ※ダブルクォーテーションが無い行もあります. ※ダブルクォーテーション内のスペースの数は,行によってそれぞれ異なります. これを,ダブルクォーテーションの中にあるスペースだけ アンダーバーに置換する場合の正規表現を教えて下さい. つまり,下記の出力にしたいです. aaa bbb aaa bbb ccc "ddd" aaa bbb ccc "ddd_eee" aaa bbb ccc ddd eee "fff_ggg_hhh_iii" ■条件 ※ちょっと古いPerlでも動くよう,ゼロ幅肯定/否定後読((?<),(!<))は使わないでください. ※単に実現するだけなら, # cat inputfile | print -pe 'sub f(){}(shift;s/ /_/;return $_;); s/(\".*\")/&f($1)/e;' みたいな感じで置換できそうですが,「正規表現だけで簡単に書けるかどうか」が知りたいのです(正規表現だけで実現出来る場合,そのアルゴリズムを知りたいです).そのため,関数と/eオプションは使わないでください.

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

    文字列のなかの"<タグ>(アルファベット1文字)"すべてに対して置換処理をさせたいのですがうまく動作しません。 現在はこう記述しております。 $str=~ s/(~<(.*?)>\w)/置換文字列/g; 良い方法があれば教えていただけると助かります。

  • 正規表現の使い方

    $input =~ s/[a-z][0-9]-[0-9]/ [a-z][0-9]-[0-9] /g; perl言語での正規表現についてです。 置換に関してなのですが、このような使い方はできないでしょうか?? [a-z][0-9]-[0-9]にヒットしたものの前と後ろにスペースを代入したいのですが、何かいいプログラミングはないでしょうか?

  • 正規表現について(Perl5準拠)

    HSPでプログラミングをしてるのですが、標準のHSPでは正規表現が使えないため、Perl5に準拠した正規表現が扱えるモジュールをインクルードして使っています。 正規表現初心者です。 プログラムのなかでファイのパスからファイル名だけにマッチするような正規表現を使いたいのですが上手くいきません。 具体的には c:円dir1円dir2円filename.xxxからfilename.xxxを抜き出すために ※円マークが質問に表示されないぬで「円」と書きました。 [^円]+$ という正規表現を考えました。意味は「円」以外の文字で始まる行末までの文字列という感じです。 「円」がメタ文字の為の記号だからダメなんでしょうか?自体を認識するためにはどのようにしたらいいのでしょうか? それとも正規表現がダメなんでしょうか? Perl5の場合でいいので、分かる方、教えてください。

  • JSP内の正規表現で、行先頭の/文字の意味は?

    お世話になります。 JSP内で、以下の正規表現で、文字列の行先頭と行末尾の 半角スペースを、置換を利用してTrim機能を実現しています。 var obj1 = document.getElementById("chaText").innerText; var obj1b = obj1.replace(/^\s+|\s+$/g, ""); document.getElementById("chaText").innerHTML = obj1b; そこでご質問させてください。 上記2行目において、 obj1.replace(/^\s+|\s+$/g, ""); という置換を実施していますが、 このreplace引数文字列の1文字目である /(スラッシュ)文字の意味を教えてください。 (他の各文字列につきましては調べが付きましたが、  この/(スラッシュ)文字を、ここに記述している意味だけが  不明の為・・・) 以上になります。 よろしくお願い致します。

  • 正規表現での$1や$2の使用方法

    正規表現の置き換え文字列部分で使用できる$1や$2の使用方法を教えてください! 以下のソース1のようにs///gの置き換え文字列部分に$1や$2を直接記述すれば、1つ目と2つ目のマッチ部分で置換が行われるのは確認しました。 しかし、ソース2のように置き換え文字列部分を変数に代入したのち、使用すると、正しく置換が行われません。 $1や$2を含んだ置き換え文字列を変数に持っている状態で、ソース1と同じ結果を得るにはどうしたらよいか、ご存知でしたら教えて下さい。 ############################## # ソース1 ############################## #!/usr/bin/perl $data = '1234567'; $ptn = '(\d{3})(\d{4})'; $data =~ s/$ptn/$1-$2/g; ############################## ↓ $dataは123-4567となる。 ############################## # ソース2 ############################## #!/usr/bin/perl $data = '1234567'; $ptn = '(\d{3})(\d{4})'; $str = "$1-$2"; $data =~ s/$ptn/$str/g; ############################## ↓ $dataは-となる。

    • ベストアンサー
    • Perl

専門家に質問してみよう