こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perlの文字列置換について

Perlで文字列置換の業務をすることになりした。
Struts1からStruts2のJSPのタグの変換です。

(1)html:textarea property="aaa" styleClass="bbb"

(2)s:textarea name="aaa" cssClass="bbb"

(1)から(2)に変換したいです。
「html:textarea」が「s:textarea」に対応しており、その属性の「property="aaa"」が「name="aaa"」に対応、 「styleClass="bbb"」が「cssClass="bbb"」に対応するといった内容です。

aaaとbbbは任意の文字列

if ($str =~ /html:textarea/ ) {
$str =~ s/html:textarea/s:textarea/;
$str =~ s/property=\"(.+)\"/name="$1"/;
$str =~ s/styleClass=\(.+)"\"/cssClass/;

というように参考書を元に作成してみたのですが、変換は行われるものの、属性のpropertyとstyleClassの順番が逆だったり、ここに記載していない他の属性を間に入れたりすると変換ができません。
どなたか教えて下さい。

投稿日時 - 2013-11-06 05:00:51

QNo.8336036

すぐに回答ほしいです

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

簡単ながら

s/(?<=html:textarea\b[^>]*)\bproperty\s*=/name=/g;
s/(?<=html:textarea\b[^>]*)\bstyleClass\s*=/cssClass=/g;
s/<html:textarea\b/<s:textarea/g;

投稿日時 - 2013-11-06 10:17:09

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

いまさらだけど,「変換できない」具体例を出した方がいいんじゃないかな.

あと, 「正確なプログラム」も.

投稿日時 - 2013-11-06 12:08:18

お礼

ご指摘ありがとうございます。

投稿日時 - 2013-11-11 16:37:53

ANo.1

> 属性のpropertyとstyleClassの順番が逆だったり

これは、もともと逆なのではないでしょうか?
順番を入れ替えるような操作は、この中にはありません。


> ここに記載していない他の属性を間に入れたりすると変換ができません

これも、本来関係無いはずです。文字列のどこにあっても変換されます。
1行ずつ処理していて、複数行になっている、ということは無いですか?
例えば
html:textarea property="aaa"
styleClass="bbb"
という2行になっていたら
html:textarea property="aaa"→「 ($str =~ /html:textarea/ ) 」が真なので変換
styleClass="bbb"→「 ($str =~ /html:textarea/ ) 」が偽なので変換対象外
となります。

逆に、複数のタグが1行に入っていて、先頭の一つだけが変換されている、ということは無いですか?
gオプション無しでは、1つしか置換されません。


> $str =~ s/property=\"(.+)\"/name="$1"/;

+は、マッチする中で一番長い文字列を採用します。
.は任意の文字で、" も対象です。
よって
html:textarea property="aaa" styleClass="bbb"
では、
$1 = aaa" styleClass="bbb
となります。
今回はそのまま元に戻す感じで使われているので問題無さそうですが、1行に複数のproperty=があると、2個目以降のpropertyは$1の中に入ってしまって、変換対象とはなりません。

投稿日時 - 2013-11-06 07:46:45

あなたにオススメの質問