• ベストアンサー

''で囲まれていない文字列にマッチする正規表現

下記のような文字列($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行で実現できる方法を探しています。 アドバイスよろしくお願いします。

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

  • ベストアンサー
  • NaKIT
  • ベストアンサー率62% (15/24)
回答No.2

$str =~ s/(?!'|\B)(\w+)(?!'|\B)/sprintf("DDD(%s)",$1)/xmsge; かな。

renkado
質問者

お礼

ありがとうございます。 求めていた処理が実現できました。 私の勉強不足で、 どうして |\B の部分が必要なのかを理解するのに 少々時間がかかってしまいました。

その他の回答 (3)

回答No.4

$str =~ s/(?<!')((?>\w+))(?!')/sprintf("DDD(%s)", $1)/xmsge; でどうでしょう。

renkado
質問者

お礼

回答ありがとうございます。 参考になりました。 ただ、私の環境が古いせいか否定後読みがエラーになってしまいました。 Sequence (?<...) not recognized at test1.plx.pl line 19.

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

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)

renkado
質問者

お礼

ありがとうございます。 大変参考になりました。

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

たとえば s/(^|[^'\w])(\w+)/$1DDD($2)/g でいいような気がする.

renkado
質問者

お礼

ありがとうございます。 参考になりました。

関連するQ&A

専門家に質問してみよう