1

テキストのタグペアを変更するには、次の Postgres SELECT 式が機能します。

select regexp_replace('The corpse of the huge <i>fin whale</i> created a spectacle on <span class="day">Friday</span> as <i>people</i> wandered the beach to observe it.',
                      '(<i>)([^/]+)(</i>)',
                      '<em>\2</em>',
                      'g');

参照番号 2 についてですが、過度の貪欲について心配しています。参照番号 2 の最初の試みは (.+) で、これは失敗でした。([^/]+) の方がうまく機能します。でも、それでいいのかしら。

その SELECT ステートメントをより堅牢にするために何かできることはありますか?

4

1 に答える 1

5

一般的に2つの可能性があります(そして両方ともPostreSQLの正規表現エンジンによってサポートされているようです)。

  1. 繰り返しを貪欲にしない:

    <i>(.+?)</i>
    
  2. ネガティブ先読みを使用して、次以外のものを確実に消費するようにします</i>

    <i>((?:(?!</i>).)+)</i>
    

どちらの場合も、不要なキャプチャを削除しました。\1これで、置換文字列で使用できます。

これらの2つは、それらが行うことにおいて同等である必要があります。ただし、パフォーマンスは異なる場合があります。前者はバックトラックが必要ですが、後者はすべての位置で先読みを試みる必要があります。どちらが速いかをプロファイリングする必要があり、個々の入力文字列に依存する場合もあります。2番目のパターンは貪欲な繰り返しを使用しているため、末尾</i>を削除しても同じ結果が得られることに注意してください。

あなたが持っているアプローチは、あなたが決して通過することができないという意味ですでに頑強です</i>。しかし同時に、あなたのアプローチはネストされたタグを許可しません(繰り返しがネストされたペアの終了タグを通過できなかったため)。

ただし、正規表現は実際にはHTMLの解析/操作の仕事に任されていないことに注意する必要があります。タグに余分なスペースがある場合はどうなりますか?または、開始タグに属性がある場合はどうなりますか?または、タグの一方または両方が属性名またはコメントに含まれている場合はどうなりますか?

于 2012-12-08T15:26:52.767 に答える