• 締切済み

Perlで可変長の先読み戻り読みができない

kumozの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

オプションでカッコの部分を読み取ってしまえば、カッコの外側のみの piyo だけを置き換えることができると思います。なお、次のコードは、文字コードの影響を受けないように ASCII のみを使っています。 $str = 'piyo ... fuga ... piyo [piyo ... fuga ... piyo ... hoge ... piyo] fuga ... piyo'; $str =~ s/((?:\[.*?\].*?)*)piyo/$1\[PIYO\]/g; print "$str\n";

cat-rice
質問者

お礼

ありがとうございました。正規表現は難しいです。

cat-rice
質問者

補足

作った例が忠実でなく、わかりにくかったかもしれません。実際には、全角文字『と』で区切りたいと思っています。

関連するQ&A

  • 正規表現否定先読み問題

    正規表現の本で以下の否定先読み問題が解答を読んでもよくわかりません。 【問題】 次の文字列で、最後のスラッシュ(「/」)の後ろに続く部分にマッチする正規表現を書きなさい。   /usr/home/gihyo/hoge.txt 【マッチする個所】 hoge.txt 【解答】 (?!.*/).+ 【解説】 「最後のスラッシュ」とは、それ以降にはスラッシュが無いという意味です。 このことから否定先読みを利用して「(?!.*/)」と書くことで最後のスラッシュの位置を特定できます。 「.*/」はスラッシュ迄の任意の文字列にマッチする正規表現です。これが否定先読みの条件になっているということは、後ろにスラッシュまでの任意の文字列がない位置にマッチするということです。 言いかえればそれ以降にスラッシュは存在しないことになります。(解説ここまで) 上記解説がよくわかりません。 (「後ろにスラッシュまでの任意の文字列がない位置」ってなんですか?) 分かる方、是非解説の解説をお願いいたします。

    • ベストアンサー
    • Java
  • 正規表現 先読み、後読みについて

    正規表現をマスターする上でさけて通れないものですが、非常に分かりづらい。 『先読み』は直後の文字を含むか含まないかということらしいですが、直後と「後ろ」なのに先読みとは如何に? 『後読み』とは直前の文字を含むか含まないか。直前と「前」なのに後読みとなっていて、駆け出しの私には混乱して紛らわしい。 基本が甘いせいもあるかもしれませんが、多くの解説書は最初から「こういうもの」としての扱いで何を先に読み、後に読んでいるのかとか、「当たり前」的なことは余り触れていません。 なぜ、このように言われているのでしょうか?

  • 秀丸で、正規表現キャプチャを利用して、置換をしたい

    ':hoge' => $ ':piyo' => $ ':puur' => $ を ':hoge' => $hoge, ':piyo' => $piyo, ':puur' => $puur, へ置換したいのですが、うまくいきません。 どう書けば良いでしょうか? ■試したこと ・検索':\(.*?\)' => $ ・置換':\1' => $\1, ※「':」と「'」の最短マッチを「\(.*?\)」でキャプチャしようしたのですが、ノーリアクションでした

  • 正規表現について

    下記期待する結果通りになる正規表現を考えておりますが、 うまくいきません。教えて下さい。 期待する結果 hoge(fuga sumomo) マッチする hoge(foo(sumomo)) アンマッチする sumomoが()で囲われている hoge(bar()sumomo) マッチする 作成した正規表現 hoge\([^(]*sumomo[^)]*\) 実際の結果 hoge(fuga sumomo) マッチ hoge(foo(sumomo)) アンマッチ hoge(bar()sumomo) アンマッチ ←予想と違う

  • 呼出したjsファイル内で他jsファイルを呼出したい

    hoge.htmlに ----------------------------------------------- <script type="text/javascript" src="piyo.js"></script> ----------------------------------------------- を記述してpiyo.jsを読み込ませました。 この状況で、piyo.js内でfuga.jsを読み込むにはどのような記述をすればよいでしょうか?

  • 【PHP】スクリプトから相対パスを知りたい

    現在、XHTML+PHPにてサイトを構築している者です。 PHP スクリプト ファイル自身から見たトップディレクトリまでの相対パスの深さを知りたいのですが、どうすれば良いのでしょうか? 例 DocumentRoot/hoge/piyo.php → ../ DocumentRoot/hoge/piyo/fuga.php → ../../ DocumentRoot/hoge/piyo/fuga/fuuga.php → ../../../ 例に示したように取得する方法を知りたいです。

    • ベストアンサー
    • PHP
  • java正規表現で複数行を取得し配列にする

    javaの正規表現で、下記のようなテキストファイルから配列を作成しようと思っています。 ---------------- .title1 hoge fuga ..title2 hoge2 fuga2 ---------------- ↓ Array[0] = ".title1 hoge fuga" Array[1] = "..title2 hoge2 fuga2" このようなテキストファイルで、上に示したように行頭が[ . ]の行から、次の行頭が[ . ]の行の直前の行までを配列の一つの要素としたいのですが、どのようにすればいいでしょうか ^\.[\w|\W]+ この表現では、「.title1」からテキストの最後までが一致してしまいます。かといって、 ^\.[\w|\W]+^\. としてしまうと、こんどは「.title2」から始まる部分の取得ができなくなってしまいます。 なにかいい方法はありませんでしょうか。正規表現以外でも構いません。よろしくお願い致します

    • ベストアンサー
    • Java
  • 文字の置換に関しての質問です

    いつもお世話になります 正規表現もしくはPerlスクリプトを用いて文字を置換するコードの書き方を教えて 頂けないでしょうか 具体例 $filename = hoge.gifを $filename = hoge.cgiという具合に変更したいのですが 宜しく御教授お願いします。

    • ベストアンサー
    • Perl
  • sedコマンド置換について(マッチした数字を演算に再利用したい)

    こんにちは Linuxのsedコマンドについて質問させてください。 軽く検索をかけたりUNIXのコマンド本を調べましたが、わかりませんでした。 例えば正規表現でマッチした数字を2倍して返す処理をする場合 perlではhogeという文字列に対して  hoge=~s/(\d+)/$1*2/g; このような処理で実現できると思います。 このように今マッチしたものに対して何か処理を行って置換するということは sedコマンド、もしくはそれを使ったシェルスクリプトで処理することは可能でしょうか? sedの方が処理速度が速いので、こちらを使いたいのです。

  • シェルスクリプト+perl

    シェルスクリプト中で1行だけperlを利用したいと思っています。 しかしシェルスクリプトで利用している変数をperlに持っていく方法が分からず悩んでいます。 ---------------------- #!/ban/bash hoge="hogehoge" perl -e ・・・ ←この中で$hogeを利用したい ---------------------- perlですべて書き直せばできるのですが、1行のためだけに、すべてを修正するのもどうかと思いましたので質問させていただきました。 もしご存知の方いらっしゃいましたらお教えください。