正規表現による置換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="dum
myString1" alt="photo1.jpg" /></a></td>
<td class="thumbcell"><a href="photo2.html"><img src="photo2.jpg" title="dum
myString2" alt="photo2.jpg" /></a></td>
<td class="thumbcell"><a href="photo3.html"><img src="photo3.jpg" title="dum
myString3" alt="photo3.jpg" /></a></td>
<td class="thumbcell"><a href="photo4.html"><img src="photo4.jpg" title="dum
myString4" alt="photo4.jpg" /></a></td>
<td class="thumbcell"><a href="photo5.html"><img src="photo5.jpg" title="dum
myString5" alt="photo5.jpg" /></a></td>
</tr>
<tr>
<td colspan="5"><div class="pages">Page:[1] <a href="index2.html" title="Jum
p 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を使った複数行検索の際の制限について』というところに見つけました.なるほ
ど...深いです.

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

[ ]