神策分析各项功能均支持正则表达式,用户可以利用正则表达式进行灵活的属性筛选。

正则表达式是对字符串进行操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

1. 例子

神策官网设有 文档 频道,该频道下的页面地址示例如下:

  • 介绍页面:https://www.sensorsdata.cn/manual/
  • 功能介绍:https://www.sensorsdata.cn/manual/features.html
  • 事件分析:https://www.sensorsdata.cn/manual/event_ana.html

可以看到,文档频道下的页面地址有个规律,即均以https://www.sensorsdata.cn/manual/ 开头。

所以,当我们想要看文档频道下的整体页面浏览数时,可用如下用正则表达式进行匹配:

/manual/.*

2. 正则表达式语法

上述表达式中的 和 是正则表达式中所使用的特殊字符中的两个。其他正则表达式字符释义如下:

2.1. 通配符

字符含义示例
.匹配任何单个字符sens.ors  sensoorssens8ors 匹配
*匹配0个或多个先前项默认的先前项是前一个字符。sens*ors  senorssenssors 匹配
+与星号的用法一样,只不过加号至少必须匹配一个先前项sens+ors  senssors 匹配,但是与 senors 不匹配
?匹配0个或1个先前项labou?r  labor  labour 匹配
执行“或”匹配a∣b 匹配 a  b

2.2. 定位符

字符含义示例
^要求您的数据位于字段开头^sensors  sensors 匹配,与 mysensors 不匹配
$要求您的数据位于字段末尾sensors$  sensors 匹配,与 sensorscan 不匹配

2.3. 分组

字符含义示例
()使用圆括号创建项,而不使用默认项Thank(s∣you)  Thanks  Thankyou 都匹配
[]使用方括号创建要匹配的项列表[abc] 匹配 ab  c
-使用方括号和短划线来扩展您的列表[A-Z] 表示英语大写字母的列表

2.4. 转义

字符含义示例
\将正则表达式字符转换为普通字符sensorsdata\.cn 这一表达式中的.不再是通配符


其他更多 正则表达式语法,请参考:

Google/re2 正则表达式语法


3. 用户 ID 正则表达式

3.1. 作用

在神策分析 1.17 及之后版本中,神策提供了可以通过设定上传数据时的 distinct_id 的值是否符合特定规则,限制上报的数据是否可以正常入库。该功能可以有效的提升数据准确性,从根源解决错误数据上报入库的问题。

distinct_id 是神策数据上报时,标识用户的必要字段,distinct_id 取值规则分为「设备 ID」和「登录 ID」,具体取值规则可参考神策的用户标识文档。

注意:如果设置 distinct_id  的正则表达式规则错误,与实际上传数据的 distinct_id 值不符合,会导致数据无法入库。因此使用该功能时需谨慎操作。在使用该功能之前,务必要和神策值班同学确认使用场景。

3.2. 使用说明

神策支持多种数据导入来源,包含客户端 SDK、服务端 SDK、神策提供的各种导入工具导入数据。目前仅可以对客户端 SDK(包含 Android SDK、iOS SDK、JS SDK、各种小程序 SDK) 以「设备 ID」标记的数据,和所有导入数据来源端以「登录 ID」标记的数据设置 distinct_id 的入库规则。

通常情况下,服务端 SDK 和神策提供的各种导入工具上传的数据,一般是以「登录 ID」上报的。对于没有设置「设备 ID」或「登录 ID」校验规则的来源端数据,则可以直接入库。比如服务端 SDK 以一个「设备 ID」上传数据时,由于对服务端 SDK 没有设置「设备 ID」校验规则,则在满足其他数据检验格式的情况下,数据可以直接入库。

3.3. 常见的「设备 ID」「登录 ID」正则表达式举例

下表根据神策客户端 SDK 常用的「设备 ID」样式和常见的「登录 ID」样式,举例写出对应的正则表达式。更多 ID 样式的正则表达式,请参考正则表达式的规则介绍,自行实现。

客户端类型ID 分类ID 规则ID 样式ID 取值时机ID 对应的正则表达式各端 SDK 设备 ID/登录 ID正则表达式


Android SDK

Android ID正常是 16 位字符(0~9,a~f)(不排除少量手机供应商产生 15,14,13 位的 Android ID ,因此本例中,暂定 Android ID 字符个数为 1~16 位)774d56d682e549cAndroid SDK 默认的匿名 ID^([0-9a-z]{1,16})$


^([0-9a-z]{1,16})$|^([0-9a-z]{8})(([/\s-][0-9a-z]{4}){3})([/\s-][0-9a-z]{12})$

UUID8-4-4-4-12 每一位都是十六进制的数字(0~9,a~f),只有小写字母550e8400-e29b-41d4-a716-446655440000Android SDK ,在获取不到 Android ID ,或者 Android  SDK 在 1.10.5 版本之前时,默认获取的匿名 ID^([0-9a-z]{8})(([/\s-][0-9a-z]{4}){3})([/\s-][0-9a-z]{12})$



iOS SDK

IDFA8-4-4-4-12 每一位都是十六进制的数字(0~9,A~F),只有大写字母DA067C52-8D48-49CE-9500-5A01368B8859iOS  SDK 默认获取的匿名 ID 


^([0-9A-Z]{8})(([/\s-][0-9A-Z]{4}){3})([/\s-][0-9A-Z]{12})$



^([0-9A-Z]{8})(([/\s-][0-9A-Z]{4}){3})([/\s-][0-9A-Z]{12})$

IDFV8-4-4-4-12 每一位都是十六进制的数字(0~9,A~F),只有大写字母

DA067C52-8D48-49CE-9500-5A01368B8859

iOS  SDK ,在取不到 IDFA 时,尝试取 IDFV 作为匿名 ID
UUID8-4-4-4-12 每一位都是十六进制的数字(0~9,A~F),只有大写字母DA067C52-8D48-49CE-9500-5A01368B8859iOS  SDK,在取不到 IDFA、IDFV 时,分配一个 UUID 作为匿名 ID


JS SDK

cookie idn-n-n-n-n 共 5 段,每一位都是十六进制的数字(0~9,a~f),n 的个数不固定(预计在 5~25 个)16e39c2c8b999e-05ae1754c671f3-38607701-2073600-16e39c2c8ba85c网页端默认的匿名 ID ^([0-9a-z]{5,})(([/\s-][0-9a-z]{5,}){4})$


^([0-9a-z]{5,})(([/\s-][0-9a-z]{5,}){4})$


小程序(各种小程序 SDK )

uuid 13-n-n-n (第一段是 13 位的时间戳,后面 3 端位数不固定,均是数字和小写字母组成)1558509239724-9278730-00c1875d5f63f8-41373096所有小程序默认的匿名 ID 为 uuid ^([0-9]{13})(([/\s-][0-9a-z]{1,}){3})$



^([0-9]{13})(([/\s-][0-9a-z]{1,}){3})$|^o[0-9a-zA-Z_-]{27}$|^o[0-9a-zA-Z_-]{28}$


微信小程序

openid小写字母 o 开头,由数字,大小写字母,下划线,横杠组成,共 28 个字符

oB4nYjnoHhuWrPVi2pYLuPjnCaU0
oB4nYjhJHQVaD0PL7qs0W1kL-_ls
oB4nYjvY13SVtaWC-AFztM2f3TlU

微信小程序可以设置使用 openid 为匿名 ID^o[0-9a-zA-Z_-]{27}$


微信小程序

unionid小写字母 o 开头,由数字,字母,下划线,横杠组成,共 29 个字符

oJeaRw70h8MKiI3IQuFPJlsZzvTEF

用户可以获取 unionid 作为微信小程序的匿名 ID 或者登录 ID^o[0-9a-zA-Z_-]{28}$



登录 ID(本文仅举例说明一些登录 ID 样式,具体的规则请以业务中实际使用的登录 ID 规则为准)

纯数字登录 ID纯数字,由 0 递增(0~6666666)12345客户自定义的登录 ID 规则

^\d+$    (验证纯数字字符串)

^[0-9]*$    (验证纯数字字符串)

^\d{n}$   (验证 n 位数字,n 输入具体的值)

^\d+$
字母+数字登录 ID数字+字母自由组合u123f56客户自定义的登录 ID 规则

^[0-9a-zA-Z]{n,m}$

(n ~m 个数字、字母组成的字符串)

^[0-9a-zA-Z]{n,m}$
纯字母的登录 ID纯字母qazwsx客户自定义的登录 ID 规则

^[a-zA-Z]{n,m}$

(n ~m 个字母组成的字符串)

^[a-zA-Z]{n,m}$
邮箱作为登录 ID邮箱(不包含中文字符的邮箱)

shence@sensorsdata.cn

test123@ss.ss.ss

test1-23@s-_s.ss.ss

邮箱格式包含【(数字、大小写、下划线、横杠、点)@(数字、大小写、下划线、横杠、点)】长度不限

^([A-Za-z0-9_\-\.])+\@[a-zA-Z0-9_\-]+([a-zA-Z0-9_\-\.])+$

^([A-Za-z0-9_\-\.])+\@[a-zA-Z0-9_\-]+([a-zA-Z0-9_\-\.])+$


针对以上部分正则表达式含义解释如下

表达式含义
[0-9a-zA-Z_-]{27}27 个字符,每个字符由 0~9 、a~z 26 个小写字母、A~Z 26 个大写字母、下划线 _ 、横杠 - 组成
$标识以这个字符结尾
^表示以某个字符开头

注意:

(1)如果某客户端 SDK 的「设备 ID」取值有多种可能,请务必在正则表达式中以「或」的关系写入。

(2)对于「登录 ID」因各家产品的 ID 规则不同,此处需要你自己使用正则表达式来定义「格式规则」,可参考此文档进行正则表达式的编写,确定规则后,请联系神策同学协助你确认正则表达式的正确性。如当前项目中存在多个产品,其「登录 ID」格式规则各不相同,请务必在正则表达式中以「或」的关系写入,如果只描述了一个组规则,有可能造成其他产品的用户数据无法正常入库。