- ベストアンサー
''で囲まれていない文字列にマッチする正規表現
下記のような文字列($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行で実現できる方法を探しています。 アドバイスよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
$str =~ s/(?!'|\B)(\w+)(?!'|\B)/sprintf("DDD(%s)",$1)/xmsge; かな。
その他の回答 (3)
- euthanasia
- ベストアンサー率63% (7/11)
$str =~ s/(?<!')((?>\w+))(?!')/sprintf("DDD(%s)", $1)/xmsge; でどうでしょう。
お礼
回答ありがとうございます。 参考になりました。 ただ、私の環境が古いせいか否定後読みがエラーになってしまいました。 Sequence (?<...) not recognized at test1.plx.pl line 19.
- sakusaker7
- ベストアンサー率62% (800/1280)
use strict; use warnings; use feature ':5.10'; while (my $line = <DATA>) { chomp $line; say "original data => ", $line; $line =~ s/(?<!['\w])(\w+)(?!')/DDD($1)/g; say "result => ", $line; } __END__ AAA = BBB - 'CCC' AAA = BBB - 'CCC', XXXX = YYY 実行例: original data => AAA = BBB - 'CCC' result => DDD(AAA) = DDD(BBB) - 'CCC' original data => AAA = BBB - 'CCC', XXXX = YYY result => DDD(AAA) = DDD(BBB) - 'CCC', DDD(XXXX) = DDD(YYY)
お礼
ありがとうございます。 大変参考になりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
たとえば s/(^|[^'\w])(\w+)/$1DDD($2)/g でいいような気がする.
お礼
ありがとうございます。 参考になりました。
お礼
ありがとうございます。 求めていた処理が実現できました。 私の勉強不足で、 どうして |\B の部分が必要なのかを理解するのに 少々時間がかかってしまいました。