0

重複した価格から結果を出力するための正規表現を教えてください。これは、価格だけでなく、html タグ内のあらゆるものに対する一般的な意味である可能性があります。

つまり、これは価格をかき集めるためのルールです。

<strong class="bigprice">(.+?)</strong>

ルールの出力: "£4.99" "£4.99" (ソース コードに同じタグが 2 つあり、その後に結果が続くため、結果が重複していることがわかります。)

両方ではなく最初の結果のみを表示したいのですが、正規表現でこれを行う方法はありますか?

4

1 に答える 1

1

説明

スペースで区切られた値のリストが与えられた£1.00 £2.00 £2.00 £1.00 £1.00場合、負の先読みを使用して後方参照値を見つけることで重複があるかどうかを検証できます。$また、複数の通貨タイプを使用できるように、文字クラスに and 記号を追加しました。これは、本質的に出力を一意にする各値の最後のインスタンスを返します。

正規表現:(?:\s|^)((?:£|$|\xC2|\xA3)\d+\.\d{1,2})(?=\s|$)(?!.*?\s\1(?=\s|$))

ここに画像の説明を入力

入力:£1.00 £2.00 £2.00 £1.00 £1.00 例へのリンク

$matches Array:
(
    [0] => Array
        (
            [0] =>  £2.00
            [1] =>  £1.00
        )

    [1] => Array
        (
            [0] => £2.00
            [1] => £1.00
        )

)

したがって、このアイデアをさらに一歩進めて、テスト式を含めて<strong class="bigprice">(.+?)</strong>の重複値を防ぐことができます(.+?)。これはhtmlのように見えるので、次の開き山括弧までのすべての文字に.+?一致するすべての文字に一致するすべての文字に一致するものを置き換えます[^<]*

正規表現:(?:<strong\s(?=[^>]*class="bigprice")[^>]*>)\s*((?:£|$|\xC2|\xA3)\d+\.\d{1,2})\s*<\/strong>(?!.*?(?:<strong\s(?=[^>]*class="bigprice")[^>]*>)\s*\1\s*<\/strong>)

ここに画像の説明を入力

入力:<strong class="bigprice">£1.00</strong><strong class="bigprice">£2.00</strong><strong class="bigprice">£1.00</strong> 例へのリンク

$matches Array:
(
    [0] => Array
        (
            [0] => <strong class="bigprice">£2.00</strong>
            [1] => <strong class="bigprice">£1.00</strong>
        )

    [1] => Array
        (
            [0] => £2.00
            [1] => £1.00
        )

)

概要

どちらの場合も、入力テキストに重複する値が見つかった場合、式は失敗します。

于 2013-06-11T15:21:07.993 に答える