
次のような構造の HTML コードがあります。
<td class="tar">
<div class="bubble in">
Some Text, I want to keep! And maybe even an image: <img src=
"12345.png" width="22" height="22" alt="0" class="example" /><br />
<span class="time"><div style="text-align:right">17:14</span></div>
</div>
</td>
</tr>
<tr>
<td class="tal">
<div class="bubble out">
Some Text, I want to keep!<br />
<span class="time"><div style="text-align:right">17:15</span></div>
</div>
</td>
</tr>
これは、2 人の参加者が「バブルイン」と「バブルアウト」するチャットの構造です。ここで、「バブルイン」のタイムコードを画像で拡張したいと思います。
私が思いついたのは次の通りです:
検索対象:
<div class="bubble in">[^"]*<span class="time"><div style="text-align:right">([0-9]*[0-9]*):([0-9]*[0-9]*)</span></div>
と置換する:
<div class="bubble in">\1<span class="time"><div style="text-align:right">\2\3\4\5\6 <img src= "test.png" width="16" height="10" alt="0"/
検索は機能しますが、\1 の置換はなぜか機能しません。助けてもらえますか? よろしくお願いします
答え1
は、そのグループをキャプチャしていないため機能\1
しません。括弧で囲む必要があります。しかし、他にも問題があるようです... Notepad++ で例を使って試してみると、一致するものが見つかりません。期待もしていません。
現在のパターンでは、開いている div タグ内のバブル、それに続く二重引用符以外の任意の数の文字、それに続く時間範囲タグが検索されます。この例では、最初に img タグに二重引用符があるため、一致しません。
時間キャプチャ部分でも、奇妙なことが起こっています。[0-9]*
つまり、0 から 9 までの数字が任意の回数出現することを意味しますが、その後、それを繰り返します。実際には、0 から 9 を 2 回繰り返し、その後にコロン、さらに 2 つが続くだけだったと思います。
それで:
<div class="bubble in">(.*?)<span class="time"><div style="text-align:right">([0-9]{2}):([0-9]{2})</span></div>
は.*?
非貪欲に一致を検索します。ただし、div 内のバブルに時間範囲がない場合、時間範囲が見つかるまで、その div から出て他の場所に移動します。うまく対処できればよいのですが、そうでなければ非常に複雑になります。 は、正確に 2 が必要であることを正規表現に伝えます。時間の先頭にゼロがない場合は、 1 から 2 までを検索するよう [0-9]{2}
に変更します。{1,2}
最後に、置換では、キャプチャされたグループが 3 つあります...「保存したいテキスト...」、時間と分。したがって、\4\5\6
存在しません。ああ、オプションにチェックマークを付けることを忘れないでください。そうしない. matches newlineと、どちらも一致しません (少なくともあなたの例では)。
幸運を!