[ 新規に投稿する ]

正規表現による置換No.41711
MAK98 さん 25/02/23 17:26 [ コメントを投稿する ]
  秀丸担当さん

正規表現を利用した HTML ソースの置換をテストしています.それがうまくいけば,マクロで grepreplace を使い複数ファイルを一括処理するという目論見です.

対象ソース:
<div id="index">
<table>
<tr>
<td class="thumbcell"><a href="photo1.html"><img src="photo1.jpg" title="dummyString1" alt="photo1.jpg" /></a></td>
<td class="thumbcell"><a href="photo2.html"><img src="photo2.jpg" title="dummyString2" alt="photo2.jpg" /></a></td>
<td class="thumbcell"><a href="photo3.html"><img src="photo3.jpg" title="dummyString3" alt="photo3.jpg" /></a></td>
<td class="thumbcell"><a href="photo4.html"><img src="photo4.jpg" title="dummyString4" alt="photo4.jpg" /></a></td>
<td class="thumbcell"><a href="photo5.html"><img src="photo5.jpg" title="dummyString5" alt="photo5.jpg" /></a></td>
</tr>
<tr>
<td colspan="5"><div class="pages">Page:[1] <a href="index2.html" title="Jump to index page 2">[2]</a></div></td>
</tr>
</table>
</div>

検索文字列:<table>\n([\s\S]*)(<tr>\n<td colspan=[\s\S]*</td>\n</tr>)\n</table>
置換文字列:<table>\n\2\1\n</table>
これで二つの <tr></tr> タグの順番を入れ替えられるはずですが,検索文字列がマッチせず,うまくいきません.

もちろん,このソースと検索文字列によるグループキャプチャは,正規表現のチェックツール(例えば https://regex101.com/)で意図通りの結果が出ることを確認しています.
なぜうまくいかないのか...秀丸エディタで正規表現を使う経験に乏しいため,なにか勘違いしているか,理解が及んでいないのだと思いますが,理由と対処法が分からず途方に暮れています.

よろしくお願いいたします.
[ ]
RE:41711 正規表現による置換No.41712
こみやんま さん 25/02/23 21:03 [ コメントを投稿する ]
  これはまぁ、長いソフトの歴史的な都合とか実装都合でこうなっちゃってるんだと思いますが、

(?#maxlines:9999)<table>\n([\s\S]*)(<tr>\n<td colspan=[\s\S]*</td>\n</tr>)\n</table>

みたいに先頭に (?#maxlines:9999) 付けないとヒットしないかと思います。(さらにヒットする長さに制限がある...)

この辺、一般的な正規表現とずれ込んできているのは
AI時代を考えると、将来的には相当に足を引っ張りそうですねぇ。
[ ]
RE:41712 正規表現による置換No.41713
MAK98 さん 25/02/23 21:30 [ コメントを投稿する ]
  こみやんま さん
マクロ会議室ではお世話になりました.

おしえていただいた (?#maxlines:9999) の挿入で検索文字列がマッチするようになり意図通りに置換が行われました.本番のソースは,順番入れ替え対象の <tr>[\s\S]*</tr> が最大で5セットあるのですが,そちらでも問題なく動作しました.9999 でなくても 255 くらいでもよさそうですが.

このパラメータ(?)のリファレンスがどこにあるのかと探してみたら,ヘルプの『\nを使った複数行検索の際の制限について』というところに見つけました.なるほど...深いです.

これで次のステージのマクロに進めます.ご教示に感謝します.
[ ]

[ 新規に投稿する ]