1

複数のキャプチャ グループで一致させるために文字列を検索しようとしています。このような 2 つのキャプチャ グループの場合、データはオプションであるため、一致する場合と一致しない場合があります。オプション -onumber を指定して pcregrep を使用して、さまざまなキャプチャ グループを返します。問題は、値が一致しない場合にデフォルト値を返すにはどうすればよいかです。選言を使用しようとしましたが、成功しませんでした。

例:

../pcre-8.32/pcregrep  -Min -o1 -o2 --om-separator="; " '(?s)<!-- BOUNDARY -->(?!.*?Read the full review).*?((\d*) of (\d*) people found the following review helpful|.*?).*?Help other customers find the most helpful' shirts/B000W18VGW

正しい行番号を生成します。

-Min -o1 -o2 --om-separator="; " '(?s)<!-- BOUNDARY -->(?!.*?Read the full review).*?(\d*) of (\d*) people found the following review helpful.*?Help other customers find the most helpful' shirts/B000W18VGW

正しい出力を生成しますが、次の行に対してのみです

(\d*) of (\d*) people found the following review helpful

上記の行が存在しない場合は、キャプチャ グループごとに「0」を返したいと思います。

これは可能ですか?

4

1 に答える 1

1

キャラクターを魔法のように出現させることはできません。つまり0、件名の文字列のどこにもない場合、 をキャプチャする方法はありません0。したがって、 a をキャプチャしたい場合は、件名0に a を挿入する必要があります0

さて、なんらかのクレイジーな理由で、件名の文字列を変更することができ、喜んで変更したとしましょう (ただし0、正規表現の外、つまりコード内で大文字と小文字を区別することができないか、変更するつもりはないようです)。それなら、ここに1つの解決策があります。

件名文字列の最後に追加0 of 0 people found the following review helpfulし、これの代わりに:

((\d*) of (\d*) people found the following review helpful|.*?)

これを行う:

(?=.*?(\d*) of (\d*) people found the following review helpful)

つまり、 を追加することにより、その文がどこか0 of 0 people [...]に存在することが保証されるため、ゼロ幅の先読みアサーション内の数字をキャプチャすることで、残りの文を続行する前に、対象文字列の任意の場所で文を探すことができます。正規表現。

于 2013-02-07T17:24:32.473 に答える