谷歌Analytics(分析)正则表达式 - 替代无负前瞻(Google Analytics Reg

2019-08-02 16:42发布

谷歌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/

我期待找出如何适应我的正则表达式来仍持有相同的匹配,但无需使用负先行的。

谢谢!

Answer 1:

谷歌Analytics(分析)似乎并不支持单和多行模式,这对我来说很有意义。 网址不能包含换行符,所以如果点不匹配他们来说并不重要,从未有任何需要^$任何地方匹配,但一开始,整个字符串的结尾。

这意味着(?!.)在你的正则表达式是完全等同于$ ,只在字符串的结尾处(如匹配\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 )。 我与谷歌Analytics(分析)没有经验,但不应该在比赛开始(和锚定)域后,对不对? 那你真的要允许在年底的空白? 在我看来,正则表达式应该是更多这样的:

^/(?:index_\w+\.php)?(?:\?ref=\d+(?:&e=\d+)?)?$


Answer 2:

首先,我觉得你的正则表达式需要一些固定。 让我们来看看你有什么:

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

在您使用可选的情况下? 在开始index...已经由第二替代照顾:

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

现在,你可能只需要第一(.*)被允许,如果确实是文字? 之前。 否则,你将匹配test.com/index_fb2.phpanystringhereandyouprobablydon'twantthat 。 因此,移动相应的可选标志:

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

现在.*消耗任何字符,并尽可能多地。 此外, . 在前面的php消耗任何字符。 这意味着你将同时允许test.com/index_fb2phptest.com/index_fb2.html?someparam=php 。 让我们作出这样的文字. 并且只允许非问号字符:

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

现在,第一,第二和第三个选项可以折叠成一个,如果我们把文件名可选,太:

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

最后, +可以去掉,因为(.*)内已经可以照顾所有可能的重复。 也(something|)是一样的(something)?

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

看到你输入的例子,这似乎是更接近你真正想要匹配的内容。

然后回答你的问题。 什么(?!.)不取决于你是否使用singleline模式与否。 如果你这样做,它声称已到达字符串的结尾。 在这种情况下,你可以简单地替换\Z ,这始终是字符串的结尾相匹配。 如果不这样做的话,就断言你已经达到了一个行的末尾。 在这种情况下,你可以使用$ ,但你也需要使用多行模式,使$匹配行结束了。

所以,如果你使用singleline模式(这可能意味着你必须每串仅一个URL),使用此:

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

如果你不使用singleline模式(这可能意味着你可以有自己的行多个URL),你也应该使用multiline模式,这种锚,而不是:

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


文章来源: Google Analytics Regex - Alternative to no negative lookahead