アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のような文字列($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行で実現できる方法を探しています。

アドバイスよろしくお願いします。

A 回答 (4件)

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


かな。
    • good
    • 0
この回答へのお礼

ありがとうございます。
求めていた処理が実現できました。

私の勉強不足で、
どうして |\B の部分が必要なのかを理解するのに
少々時間がかかってしまいました。

お礼日時:2009/07/10 21:38

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


でどうでしょう。
    • good
    • 0
この回答へのお礼

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

ただ、私の環境が古いせいか否定後読みがエラーになってしまいました。
Sequence (?<...) not recognized at test1.plx.pl line 19.

お礼日時:2009/07/10 21:34

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)
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/10 21:40

たとえば


s/(^|[^'\w])(\w+)/$1DDD($2)/g
でいいような気がする.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/10 21:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!