6

Google Analyticsは、フィルター内でネガティブな先読みを許可しなくなりました。これは、私が含めたいリンクだけを含むカスタムレポートを作成するのが非常に難しいことを証明しています。

有効にした場合に機能する負の先読みを含む正規表現は次のとおりです。

test.com(\/\??index\_(.*)\.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)

これは一致します:

test.com
test.com/
test.com/index_fb2.php
test.com/index_fb2.php?ref=23
test.com/index_fb2.php?ref=23&e=35
test.com/?ref=23 
test.com/?ref=23&e=35

一致しません(そうあるべきです):

test.com/ambassadors
test.com/admin/?signup=true 
test.com/randomtext/

ネガティブな先読みを使用せずに、同じ一致を保持するように正規表現を適応させる方法を探しています。

ありがとうございました!

4

2 に答える 2

4

Google Analyticsは、単一行モードと複数行モードをサポートしていないようです。これは私には理にかなっています。URLに改行を含めることはできないため、ドットが改行と一致するかどうかは関係ありません。また、文字列全体の最初と最後以外の場所で一致する必要は^ありません。$

つまり(?!.)、正規表現のin$は、文字列の最後でのみ一致する、とまったく同じです(\zたとえば、それをサポートするフレーバーで)。これが正規表現の唯一の先読みであるため、この問題が発生することはなかったはずです。あなたはずっと使っていたはずです$

ただし、正規表現には他の問題があります。これは主に、への過度の依存が原因(.*)です。たとえば、次の文字列と一致します。

test.com/?^#(%)!*%supercalifragilisticexpialidocious
test.com/index_ecky-ecky-ecky-ecky-PTANG!-vroop-boing_rowr.php (ni! shh!)

...あなたが望んでいないと私はかなり確信しています。:P

この正規表現を試してください:

test\.com(?:/(?:index_\w+\.php)?(?:\?ref=\d+(?:&e=\d+)?)?)?\s*$

またはもっと読みやすく:

test\.com
(?:
  /
  (?:index_\w+\.php)?
  (?:
    \?ref=\d+
    (?:
      &e=\d+
    )?
  )?
)?
\s*$

説明のために、(たとえば、どのパラメーターが存在する可能性があるか、どのような順序で表示されるか、およびそれらの値はどのようなものになるか)について、多くの単純化した仮定を行っています。ドメイン()を一致させることが本当に必要かどうかも疑問に思いますtest.com。私はGoogleAnalyticsの経験がありませんが、ドメインの直後に試合を開始する(そして固定する)べきではありませんか?そして、あなたは本当に最後に空白を考慮に入れる必要がありますか?私には、正規表現は次のようになっているはずです。

^/(?:index_\w+\.php)?(?:\?ref=\d+(?:&e=\d+)?)?$
于 2012-11-13T16:04:52.890 に答える
1

まず、正規表現には修正が必要だと思います。あなたが持っているものを見てみましょう:

test.com(\/\??index_.*.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)

?の開始時にオプションを使用する場合index...は、2番目の選択肢によってすでに処理されています。

test.com(\/index_.*.php\??(.*)|\/\?(.*)|\/|)+(\s)*(?!.)

(.*)これで、実際に前にリテラルがあった場合は、おそらく最初のものだけを許可する必要があり?ます。それ以外の場合は一致しtest.com/index_fb2.phpanystringhereandyouprobablydon'twantthatます。したがって、対応するオプションのマーカーを移動します。

test.com(\/index_.*.php(\?(.*))?|\/\?(.*)|\/|)+(\s)*(?!.)

現在.*、任意の文字を可能な限り消費します。また、.前のphp文字はすべての文字を消費します。これは、との両方test.com/index_fb2phpを許可することを意味しますtest.com/index_fb2.html?someparam=php.これをリテラルにして、疑問符以外の文字のみを許可しましょう。

test.com(\/index_[^?]*\.php(\?(.*))?|\/\?(.*)|\/|)+(\s)*(?!.)

これで、ファイル名もオプションにすると、1番目と2番目と3番目のオプションを1つにまとめることができます。

test.com(\/(index_[^?]*\.php)?(\?(.*))?|)+(\s)*(?!.)

最後に、内部はすべての可能な繰り返しをすでに処理できる+ため、を削除することができます。(.*)また(something|)、と同じ(something)?です:

test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*(?!.)

入力例を見ると、これは実際に一致させたいものに近いようです。

次に、あなたの質問に答えます。何をするかは、モード(?!.)を使用するかどうかによって異なります。singlelineそうした場合、文字列の終わりに到達したことを表明します。この場合\Z、それを単に文字列の終わりに一致する。に置き換えることができます。そうでない場合は、行の終わりに到達したと主張します。この場合は使用できます$が、行末にも一致するように複数行モードも使用する必要があります$

したがって、singlelineモードを使用する場合(つまり、文字列ごとにURLが1つしかないことを意味します)、次のように使用します。

test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*\Z

モードを使用しない場合singleline(おそらく、独自の行に複数のURLを含めることができることを意味します)、multiline代わりにモードとこの種のアンカーも使用する必要があります。

test.com(\/(index_[^?]*\.php)?(\?(.*))?)?(\s)*$
于 2012-11-13T13:45:11.303 に答える