1

Woofy (ウェブコミックをダウンロードするプログラム)のスクリプトを作成しようとしていますが、Expresso によると、前のページへのリンクを見つけるための正規表現が機能していないようです。私は次の行に沿って何かを見つけようとしています:

<a href="http://70-seas.com/?p=1253" title="Prologue 01" class="previous-comic-link"><span>&lsaquo; Previous</span></a>

これは各ページによって異なり、URL とタイトルが変更されて、前のページが何であれ、次のようにリンクされます。

<a\shref="http://70-seas.com/?p=[0-9]{4}"\stitle="[.]*\s[.]*\s([.]*)?"\sclass="previous-comic-link"><span>&lsaquo;\sPrevious</span></a>

(タイトルに 3 つの単語が含まれる場合もあれば、2 つの単語が含まれる場合もあります。ただし、最後の単語には常に数字が含まれます。)

私は正規表現の経験や正式なトレーニングをまったく受けていないため、何が間違っているのかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

0

対処すべきことがいくつかあります。

まずはそのhttp://70-seas.com/?p=[0-9]{4}部分をご覧ください。/?here は、/文字がオプションであることを意味します。URL に一致させるには、リテラル?文字に一致させます。文字は正規表現のメタ文字であるため、?何かをオプションにするため、文字どおりに一致させるにはエスケープする必要があります。これを行うには、 を使用します\?。したがって、更新された部分は になりhttp://70-seas.com/\?p=[0-9]{4}ます。タグも追加したexpressoので、パターン ツリーをたどってこの問題を見つけることができました。

次に、本当の問題はこの部分にあります: title="[.]*\s[.]*\s([.]*)?". 正規表現の角括弧は、内部の文字のいずれかに一致する文字クラスを示します。[.]は、「「」に一致する」という意味です。あなたの意図ではないキャラクター」。おそらく、任意の文字に一致するメタ文字を使用したかったのです.が、代わりに、文字クラス内に配置することで文字どおりに一致することになりました。\s次に、3 番目の部分をオプションにしましたが、これはおそらく、最後のオプション グループ内に を含めるつもりだったからです。これらの点を念頭に置いて、次を使用する必要がありましたtitle=".*\s.*(\s.*)?"

それはうまくいくはずです。ただし、これは最適な正規表現ではなく、.*通常、 の使用は危険信号です。.任意の文字に一致し、意図した以上に消費する可能性がある貪欲なパターンです。試して具体的にするのが最善です。英数字に一致させたい場合は、\w代わりに使用します。あなたの説明に基づいて、あなたは1〜3語を期待しています. これは と表現できます\w+(?:\s\w+){0,2}。はるかにクリーンで理解しやすい。これは、1 つまたは複数の英数字に一致し、その後に非キャプチャ グループが続くことを示します。これ(?:\s\w+)は、空白に一致し、次に 1 つまたは複数の英数字に再び一致することを意味します。最後に{0,2}、グループの最後に量指定子を配置して、このグループを 0 ~ 2 回一致させたいことを示します。の(?:...)構文は、キャプチャが必要ない場合、グループを非キャプチャにします。これにより、パフォーマンスが向上します。

また、すべての二重引用符をエスケープする必要があります。使用しているものによって違いが生じる場合とそうでない場合がありますが、一般的には必要です。したがって、二重引用符は になり\"ます。

次のようなパターンが必要です。

<a\shref=\"http://70-seas.com/\?p=[0-9]{4}\"\stitle=\"\w+(?:\s\w+){0,2}\"\sclass=\"previous-comic-link\"><span>&lsaquo;\sPrevious</span></a>

それは素晴らしいことですが、これはもっと簡単かもしれません。二重引用符の間でコンテンツを一致させる必要があり、後で参照するためにその中の項目を一致させる必要がない限り、 を使用してこれを簡略化できますtitle=\"[^"]+\"。パーツは、文字クラスの先頭にある文字[^"]+によって示される負の文字クラスを使用します。^基本的に、二重引用符ではない任意の文字に一致します。タイトルの最後に二重引用符があると、一致は終了します。タイトルの内容全体を一致させたいだけなので、1 ~ 3 単語を気にする必要はありません。

新しいパターンは次のようになります。

<a\shref=\"http://70-seas.com/\?p=[0-9]{4}\"\stitle=\"[^"]+\"\sclass=\"previous-comic-link\"><span>&lsaquo;\sPrevious</span></a>
于 2013-11-13T16:43:02.110 に答える