- ベストアンサー
難問?Perlの文字列置換について
- Perlの文字列置換について困っています。具体的には、以下のプログラムをベースにして置換を行いたいです。
- 目標は以下のような置換結果になるようです。
- しかし、どうしてもこの置換ができずに困っています。誰か教えていただけないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
えぇと, 実は「属性の順番に意味がある」方が (ある意味) 簡単だったりします. というのは, そのような場合には元のソース自体で ・styleClass → paramId → paramName → action という順に属性が表れる という仮定ができる可能性があるからです. もしそうなら難しくないですよね. これが, 「元のソースからして属性の順番がぐちゃぐちゃ」ということになると, わりとまじめに属性を処理する必要があります. まあできるんだけど, そういうことだと s でちまちま置換するよりも「元のソースから目的の文字列を『構築』する」という方針を考えた方が早いような気がする. 例えば $ref = "numa"; $paramId = "Id"; $paramName = "Name"; $class = "push"; $click = "URL"; $content = "ソース"; と変数に値があるときに <s:a href="numa" paramId="Id" paramName="Name" cssClass="push" onclick="URL">ソース</s:a> という文字列を作りたい (上の変数の値を href や paramId などの属性の値にする) としたら, どう作りますか?
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
あ, 今気づいた. 「やりたいこと」の中に ・ action="/numa.do"を/numaに変換 ってあるんだけど, 「目標」の方にはこの属性が入ってない. そして, なぜか href なんて属性が増えてる. つまり「やりたいこと」が「目標」を正確には反映していない. あと #1 に補足: ・最終的に属性はどのような順番で並べればいいんでしょうか (「ほかの属性がある」場合には特に問題になるんだけど, そうでない場合も含めて)? ・元のソースで styleClass 属性の値が push でなかった場合にはどうすればいい? ・paramId, paramName および onclick の各属性の値は変わりえる?
- Tacosan
- ベストアンサー率23% (3656/15482)
まず, この手のことを本格的にやろうとしたら XML を扱うライブラリを使うことを考えるべきです. 例えば, 複数行にわたっていたりネストしていたりすると, 正規表現だけではなかなか難しいことをさせられる可能性があります. 逆に言えば, 「1行に収まっていて」「ネストはしていない」状況なら正規表現で処理することができます. ただし本題に入る前に以下の点を確認させてください: ・ほかの属性があったらどうしますか? ・「styleClassをcssClassに変換(これはわかるのですが位置の修正がわかりません。。)」とありますが, 「位置の修正」ってなんですか? そして, それはなぜしなければならないのですか (相手がよほどアホでない限り無意味な操作ですよ)? ついでに, 置き換えた結果を使う相手がよほどのアホであるという悲惨な状況を想定した場合, cssClass 属性はどこに入れる必要があるんですか? ・「action="/numa.do"を/numaに変換」とありますが, action 属性の値が "/numa.do" 以外のときは変換しないままでいいんですか? ・「paramIdとparamNameの文字列が同一の場合」のところに書いてある「%{ Id }」ってなんですか?
補足
・actionをhrefの属性に変更になります。 action="/numa.do"をhref="/numa"にしたいです。 ごめんなさい、属性の順番(位置)については考慮しなくてもよくなりましたので順番は特に問題ないです。 >・元のソースで styleClass 属性の値が push でなかった場合にはどうすればいい? その場合、属性の値は元の値と先の値を同じにさせます。 ・paramId, paramName および onclick の各属性の値は変わりえる? はい、変わります。