1

別のプロジェクトからいくつかのコードを採用しましたが、めちゃくちゃです。すべてのタグを選択 (そして最終的には削除) したいのですが、タグ内の<br/>タグのみを選択します。これには正規表現がありますか? <pre>

These 2 lines should not be<br/>
touched. Example only.<br/><br/>

<pre class="code">mysql&gt;
<strong> SELECT state, COUNT(*) FROM president GROUP BY state;</strong><br/>
+-------+----------+<br/>
| state | COUNT(*) |<br/>
+-------+----------+<br/>
| OH    |        7 |<br/>
| PA    |        1 |<br/>
| SC    |        1 |<br/>
| TX    |        2 |<br/>
| VA    |        8 |<br/>
| VT    |        2 |
+-------+----------+</pre>
4

1 に答える 1

0

\Gツールについて言及していないので、正規表現エンジンが1をサポートしていると仮定します。これは生の正規表現であり、エスケープが必要になる場合があることに注意してください。

((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)<\s*/?\s*br\s*/?\s*>

置換:$1

pre重要な仮定は、入力に (有効な) ネストされたタグが存在しないことです。

デモ。(注: エスケープのため、デモでは正規表現が若干異なる場合があります)。

((?:<pre|\G(?!^))(?:(?!</pre|<\s*/?\s*br)[/s/S])*)この部分は、タグの先頭を検索するpreか、最後の一致 (br内部のタグpreが見つかった場所) から続行し、有効な終了タグにヒットするまですべての文字を取得しますpre(正規表現の次の部分が一致するため、先にスキップする必要があります)。brタグ) またはbrタグ。(?!^)afterは、タグ内にある場合にのみ一致\Gすることを確認するヒューリスティックです。それ以外の場合は、入力の開始にも一致します。\Gpre

有効なタグは<、開始タグの と タグ名の間<にスペースを入れてはならず、終了タグの と とタグ名の間にスペースを入れてはなりません/参照。この事実は、タグの境界をチェックするために適用されますpre(preタグは、有効な終了タグが見つかった場合にのみ終了します)。ただし、コードはタグのように見えるすべてのタグに一致しbr(上記の構文によっては有効でない場合があります)、それらを削除します。

brこれは、タグに一致する部分です: <\s*\/?\s*br\s*\/?\s*>. ご覧のとおり、< /br>または</ br>または< br>またはなどの不適切なタグにも一致します</br/>。これらのケースがクリーンアップされることを気にしないと思います。

脚注

  1. エンジンが\G最終一致境界をサポートしている場合、否定先読みなど、この正規表現で使用した他の機能もサポートする必要があります(?!pattern)
于 2013-01-13T10:56:32.797 に答える