小括号、中括号和大括号都在正则式中有特殊的用途,即都属于元字符。下面分别介绍一下各自的用法。
一、小括号
()的作用主要有是作为子表达式将括号中匹配的内容存储起来,可以在以后调用;另外也可以改变计算的优先级(和数学上的作用差不多)。
1、子表达式
GA的默认代码只会在报告中显示URI,如下图所示:
我们可以看到默认的设置中是不会显示域名的。因此,对于有多个子域相同URI会作为一条记录处理,比如a.site.com/index.html和b.site.com/index.html,会显示为/index.html一条记录。
如何让GA可以区分子域呢?这就涉及到用高级过滤器来进行字段值重写。GA的过滤器提供对报告集(配置文件)中的记录及字段值的处理。比如,按照一定的字段过滤或包含指定记录;按照一定规则,重写某些字段值。下面就是让GA在报告中显示完整URL的高级过滤器。
这是GA高级过滤器的一个例子。高级过滤器的作用是从一个或两个字段中抽取其中的内容,然后输出到一个字段中。
对于上面的例子,我们首先看一下(.*),这个正则表达式。它是由三个元字符组成,.表示任意字符,*表示重复前面的0个或多个字符,.*合在一起可以匹配任意字符。()的作用在这里是将其中匹配的信息存储了起来。
那对于字段A,来说就是把hostname这个字段的所有内容都匹配出来,并且存储了起来。字段B也是一样。
然后构建器,我们还是先来看一下这个正则式$A1$B1。$的意思是表示提取子表达式的值,A1和B1则表示是哪个表达式的值。$A1表示的是字段A中第1个子表达式匹配的信息,是的,一个正则式中可以包含多个子表达式。$A1$B1的意思就是把字段A中第1个子表达式匹配的信息和字段B中所匹配的信息组合在一起。具体就是说将hostname和request URI合在一起,这样我们就获得的完整的URL。
上面这个例子就说明了()作为子表达式的应用情景,下面我们再来看一下,()改变优先级的例子。
2、改变优先级
在正则式,各个元字符会进行一定操作,而不同的操作之间存在优先级。一个最简单也最容易记住的例子是|,|在正则式中表示或的意思,其优先级最低。比如,ab|c、a|bc和a(b|c)这三个表达式。ab|c可以匹配的是ab和c;a|bc可以匹配的是a和bc;而a(b|c)则可以匹配ab和ac。
假设以下情景,网站www.abc.com有多个子目录,比如www.abc.com/sport,www.abc.com/travel,www.abc.com/entertainment等其他十几个子目录,你需要将sport和travel和entainment的流量放在一个配置文件中。假设已经使用了上面的完整URL过滤器。你会如何去写?直接用|连接三个url就可以了。www\.abc\.com/sport|www\.abc\.com/travel|www\.abc\.com/entertainment,这个表达式是可以满足需求的,但是,其中的域名部分都是一样的。我们可以用()将子目录部门括起来变成这个形式:www\.abc\.com/(sport|tralvel|entertainment)。如果是将不同的子域放在一个配置文件中也是一样道理。
有的同学可能会问为什么不使用多个include过滤器,比如第一个include sport子目录,再用一个include travel子目录。这里需要说明一下,GA过滤器的逻辑关系是与,如果我们连续使用多个include过滤器的话,相当于告诉GA,给我包含同时既是sport和travel两个子目录的流量,这样的流量是不存在,我们需要的是或的关系,来自sport子目录或travel子目录的流量。
小括号的用法就介绍到这里,我们接下来看一下中括号的使用。
二、中括号
[]在正则式中表示的是一个字符集。比如[abc]可以匹配a、b、c与(a|b|c)的作用相同。还需要介绍与[]配套使用的两个符号,-和^。
-是连字符,用来表示一个范围。比如[ac]匹配是a、c,而如果是[a-c]则可以匹配a、b、c。同理,[0-9]匹配单个的数字,以此类推。
^是表示否定的意思,当然这是在[]中间的情况,在[]以外的话,表示的是起始位置。[abc]匹配的是a、b、c,而[^abc]则匹配是除了abc以外的单个字符。
我们再来看一个实际的应用例子。还是使用上面那个基本情况,这个网站呢还有多个子域,game.abc.com、news.abc.com等等,新的需求是将这些非www的子域与www子域下的sport和travel子目录合并为一个配置文件。
将www子域下的几个二级目录合并在前面已经探讨,只需要处理非www,我们可以使用这样的正则式^([^w]..|.[^w].|..[^w])。
完整的正则式为:^([^w]..|.[^w].|..[^w])|www.abc.com/(sport|travel)
同样还是使用一个include过滤器。
我们再来看一个()和[]结合的例子,提取来自百度的前一个搜索词。
首先我们来看百度搜索的URL规则,我们先输入一个搜索词,正则式,得到的URL是http://www.baidu.com/s?wd=%D5%FD%D4%F2%CA%BD&rsv_bp=0&rsv_spt=3&inputT=2500,我们再输入一个http://www.baidu.com/s?tn=baiduhome_pg&bs=%D5%FD%D4%F2%CA%BD&f=8&rsv_bp=1&rsv_spt=1&wd=%D5%FD%D4%F2%B1%ED%B4%EF%CA%BD&inputT=2695。通过对比这两个URL,我们可以看到其中的wd参数的值代表是搜索词(gb2312编码),bs参数的值是用户前一次搜索的词。
我们的目的是提取bs参数的值。我们先来看一下bs这个参数前后的内容,bs的前面是&(如果是第一个参数的话,也可能是?),bs值的后面也是&。(\?|&)bs=([^&])*这个正则式就可以匹配出百度的前一个搜索词。
让我们把百度的前一个搜索词放在User Defined(你也可以放在其他的字段)里面:
这里面有一个地方需要注意,构建其中使用的是$A2,代表的是使用字段中的第二个子表达式的值。即[^&]*所匹配的内容。
这里看一下([^&]*)这个子表达式,[^&]是匹配非&的单字符,[^&]*则匹配到下一个&为止所有的字符。
我们可以把(\?|&)参数名=([^&]*),看做一个通用的正则式,可以用来提取任意参数的值,比如,提取百度的搜索词(\?|&)(wd|word)=([^&]*),提取google的排名(\?|&)cd=([^&]*),提取google的搜索类别(\?|&)source=([^&]*)。
中括号的基本用途也介绍到这里,我们再来看一下最后一个括号——大括号。
三、大括号
大括号在正则式中的作用是用来控制数量,*?+这三个元字符在正则式中也是用来表示数量。*表示前一个元素重复0或多次,+表示前一个元素重复1到多次,?表示前一个元素重复0到1词。而{m,n}则表示前一个元素重复m-n次。也可以是{m}的形式表示前一个元素重复m次。
前面的例子中,我们使用^([^w]..|.[^w].|..[^w])来匹配非www开头,其实可以改写为^[^w]{3}。
{}还有一个重要的应用是在匹配IP时,比如用于GA的IP过滤。如果你想要匹配123.192.168.0-123.192.168.99这个范围的IP,那么,你可以使用这个正则式:123\.192\.168\.[0-9]{1,2}
友情提示:安装过滤器之后,GA只会对后进入的数据按照过滤器处理。历史数据的形式不变。GA处理数据的周期为4小时一次,大型网站可能是一天。另外,配置文件对数据的操作是不可逆的,为避免错误,请保留一个未加任何过滤器的配置文件。
好了,关于正则式中的括号就介绍到这里~不知道您看懂了没~希望这篇正则式菜鸟写的教程能够帮助您理解这些括号在正则式及GA中的应用。如果您有什么疑问欢迎给我留言~






这两篇关于GA正则表达式的文章很详细,深入浅出。让我终于弄明白了,谢谢cloga
写得非常到位 让我们这些初学者一看就懂 :)
欢迎常来~
大神 谷歌的是不是没办法跟踪前一个搜索词?
谷歌搜索的referrer不提供前一个搜索词的参数,所以是没办法的~