正则处理函数

最近更新时间:2024-10-21 14:25:52

我的收藏

简介

日志含有大量的文本,在对文本的处理过程中,正则函数可以较为灵活的提取关键字、做脱敏、或者判断是否包含有指定的字符。如下图所示:


日志场景中常见的正则举例,请参见 在线测试正则公式
用途
日志原文
正则表达式
提取结果
提取大括号中的内容
[2021-11-24 11:11:08,232][328495eb-b562-478f-9d5d-3bf7e][INFO] curl -H 'Host: ' http://abc.com:8080/pc/api -d '{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 14], "orderField": "createTime"}}}
\\{[^\\}]+\\}
{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 10], "orderField": "createTime"}}}
提取中括号的内容
[2021-11-24 11:11:08,232][328495eb-b562-478f-9d5d-3bf7e][INFO] curl -H 'Host: ' http://abc.com:8080/pc/api -d '{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 14], "orderField": "createTime"}}}
\\[\\S+\\]
[328495eb-b562-478f-9d5d-3bf7e][INFO]
提取时间
[2021-11-24 11:11:08,232][328495eb-b562-478f-9d5d-3bf7e][INFO] curl -H 'Host: ' http://abc.com:8080/pc/api -d '{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 14], "orderField": "createTime"}}}
\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}
2021-11-08 11:11:08,232
提取特定长度的大写字符
[2021-11-24 11:11:08,232][328495eb-b562-478f-9d5d-3bf7e][INFO] curl -H 'Host: ' http://abc.com:8080/pc/api -d '{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 14], "orderField": "createTime"}}}
[A-Z]{4}
INFO
提取特定长度的小写字符
[2021-11-24 11:11:08,232][328495eb-b562-478f-9d5d-3bf7e][INFO] curl -H 'Host: ' http://abc.com:8080/pc/api -d '{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 15], "orderField": "createTime"}}}
[a-z]{6}
versio
passwo
timest
interf
create
提取字母+数字
[2021-11-24 11:11:08,232][328495eb-b562-478f-9d5d-3bf7e][INFO] curl -H 'Host: ' http://abc.com:8080/pc/api -d '{"version": "1.0", "user": "CGW", "password": "123", "timestamp": 1637723468, "interface": {"Name": "ListDetail", "para": {"owner": "1253", "limit": [10, 14], "orderField": "createTime"}}}
([a-z]{3}):([0-9]{4})
com:8080

regex_match 函数

函数定义

基于正则对数据进行匹配,返回是否匹配成功,可以选择全匹配还是部分匹配。
说明:
在部分场景下,该函数可使用 str_exits 函数代替,处理效率更高。
语法描述
regex_match(data, regex="", full=True)

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
data
字段值
string
-
-
regex
正则表达式
string
-
-
full
full=True, 完全匹配,代表regex完全匹配data,regex_match 函数才会返回True
full=False,部分匹配,代表regex匹配了data的一部分,regex_match函数就会返回True.
bool
True
T/F

示例

示例1:判断正则公式"\\d{3}.\\d{3}.\\d.\\d"和192.168.0.1是否完全匹配,regex_match 函数返回 True。正则表达式"\\d{3}.\\d{3}"和192.168.0.1是否完全匹配,regex_match 函数返回 False. 原始日志:
{"IP":"192.168.0.1", "status": "500"}
加工规则:
//判断正则公式"\\d{3}.\\d{3}.\\d.\\d"和字段ip的值192.168.0.1是否完全匹配,将结果保存到新字段"matched"中。
t_if_else(regex_match(v("IP"), regex="\\d{3}.\\d{3}.\\d.\\d", full=True), fields_set("matched", True),fields_set("matched", False))
//正则公式"\\d{3}.\\d{3}"和字段ip的值192.168.0.1是否完全匹配:
t_if_else(regex_match(v("IP"), regex="\\d{3}.\\d{3}", full=True), fields_set("matched2", True),fields_set("matched2", False))
{"IP":"192.168.0.1","matched":"TRUE","matched2":"False","status":"500"}
示例2:判断正则公式"\\d{3}.\\d{3}"和字段 IP 的值192.168.0.1是否部分匹配,regex_match 函数返回 True。 原始日志:
{"IP":"192.168.0.1", "status": "500"}
加工规则:
t_if(regex_match(v("IP"), regex="\\d{3}.\\d{3}", full=False), fields_set("matched", True))
加工结果:
{"IP":"192.168.0.1","matched":"TRUE","status":"500"}

regex_select 函数

函数定义

基于正则对数据进行匹配,返回相应的部分匹配结果,可以指定匹配结果的第几个表达式,以及第几个分组(部分匹配+指定捕获组序号),如果最终没有匹配结果,则返回空字符串。

语法描述

regex_select(data, regex="", index=1, group=1)

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
data
字段值
string
-
-
regex
正则表达式
string
-
-
index
匹配结果中的第几个表达式
number
默认第一个
-
group
匹配结果中的第几个分组
number
默认第一个
-

示例

根据正则表达式,对字段值进行不同的截取。
原始日志:
{"data":"hello123,world456", "status": "500"}
加工规则:
fields_set("match_result", regex_select(v("data"), regex="[a-z]+(\\d+)",index=0, group=0))
fields_set("match_result1", regex_select(v("data"), regex="[a-z]+(\\d+)", index=1, group=0))
fields_set("match_result2", regex_select(v("data"), regex="([a-z]+)(\\d+)",index=0, group=0))
fields_set("match_result3", regex_select(v("data"), regex="([a-z]+)(\\d+)",index=0, group=1))
加工结果:
{"match_result2":"hello123","match_result1":"world456","data":"hello123,world456","match_result3":"hello","match_result":"hello123","status":"500"}

regex_split 函数

函数定义

基于正则对数据进行分割,返回 JSON Array 字符串(部分匹配)。

语法描述

regex_split(data, regex=\\"\\", limit=100)

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
data
字段值
string
-
-
regex
正则表达式
string
-
-
limit
分割最大数组长度,当超过长度时,剩余未分割部分将作为一个元素,添加到数组
number
默认值100
-

示例

原始日志:
{"data":"hello123world456", "status": "500"}
加工规则:
fields_set("split_result", regex_split(v("data"), regex="\\d+"))
加工结果:
{"data":"hello123world456","split_result":"[\\"hello\\",\\"world\\"]","status":"500"}

regex_replace 函数

函数定义

基于正则匹配并替换(部分匹配),主要用于脱敏场景。

语法描述

regex_replace(data, regex="", replace="", count=0)

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
data
字段值
string
-
-
regex
正则表达式
string
-
-
replace
目标字符串,使用此字符串替换匹配结果
string
-
-
count
替换次数,默认0,进行全部替换
number
默认值0
-

示例

示例1:根据正则表达式,对字段值进行替换。 原始日志:
{"data":"hello123world456", "status": "500"}
加工规则:
fields_set("replace_result", regex_replace(v("data"), regex="\\d+", replace="", count=0))
加工结果:
{"replace_result":"helloworld","data":"hello123world456","status":"500"}
示例2:对用户 ID、手机号码、IP 地址进行脱敏。 原始日志:
{"Id": "dev@12345","Ip": "11.111.137.225","phonenumber": "13912345678"}
加工规则:
//对 Id 字段进行脱敏处理,结果为dev@***45
fields_set("Id",regex_replace(v("Id"),regex="\\d{3}", replace="***",count=0))
fields_set("Id",regex_replace(v("Id"),regex="\\S{2}", replace="**",count=1))
//对 phonenumber 字段进行脱敏处理,将中间的4位数替换为****,结果为139****5678
fields_set("phonenumber",regex_replace(v("phonenumber"),regex="(\\d{0,3})\\d{4}(\\d{4})", replace="$1****$2"))
//对 IP 字段进行脱敏处理,将第二段替换为***,结果为11.***137.225。
fields_set("Ip",regex_replace(v("Ip"),regex="(\\d+\\.)\\d+(\\.\\d+\\.\\d+)", replace="$1***$2",count=0))
加工结果:
{"Id":"**v@***45","Ip":"11.***.137.225","phonenumber":"139****5678"}

regex_findall 函数

函数定义

基于正则进行匹配,并将匹配结果添加到 JSON 数组中,并返回 Array 字符串(部分匹配)。

语法描述

regex_findall(data, regex="")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
data
字段值
string
-
-
regex
正则表达式
string
-
-

示例

原始日志:
{"data":"hello123world456", "status": "500"}
加工规则:
fields_set("result", regex_findall(v("data"), regex="\\d+"))
加工结果:
{"result":"[\\"123\\",\\"456\\"]","data":"hello123world456","status":"500"}

sensitive_detection函数

函数定义

检测敏感信息,例如身份证、银行卡等敏感信息。
注意:
请谨慎使用脱敏遮盖选项 replace_items,脱敏后的数据无法复原。

语法描述

sensitive_detection(scope="", ratio=1, discover_items="", replace_items="")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
scope
检测字段名称
string
ALL_FIELDS
-
sample_ratio
检测比例,取值如下:
1:表示全部检测
0.5:表示采样 50% 进行检测
number
-
-
discover_items
检测项,以 , 分隔
string
-
CHINA_PHONE_NUM,EMAIL,CHINA_IDCARD, ADDR,DEBIT_CARD,CREDIT_CARD,CHINA_PASSPORT,MAC_ADDR,IP,DOMAIN,LOCATION,VIN,PLATE_NUMBER,NAME,PASSWORD,TOKEN
replace_items
遮盖项,以 , 分隔
string
-
CHINA_PHONE_NUM,EMAIL,CHINA_IDCARD, ADDR,DEBIT_CARD,CREDIT_CARD,CHINA_PASSPORT,MAC_ADDR,IP,VIN,PASSWORD,TOKEN,NAME

示例

原始日志:
{
"sensitive_field1": "CLS log 13912345678 my car JTJHT00W274025559 www.tencent.com CLS数据加工",
"sensitive_field2": "etl@tenctent.com ",
"NON_sensitive_field": "hello world"
}
加工规则:
/*scope=ALL_FIELDS意为搜索整条日志中的所有字段
sample_ratio=1,意为对所有的日志进行敏感信息检测
电话、Email进行检测
并将电话信息脱敏(遮盖),请谨慎使用replace_items选项,遮盖后无法复原.*/
sensitive_detection(scope="ALL_FIELDS", sample_ratio=1, discover_items="CHINA_PHONE_NUM,EMAIL",replace_items="CHINA_PHONE_NUM")
加工结果:
{
"NON_sensitive_field":"hello world",
"SENSITIVE_FLAGS":"CHINA_PHONE_NUM,EMAIL",//检测到了电话号码和邮件两种敏感信息
//遮盖了电话号码
"sensitive_field1":"CLS log 189****2829 my car JTJHT00W274025559 www.tencent.com CLS数据加工",
"sensitive_field2":"etl@tenctent.com "
}

敏感检测项说明:

敏感信息项
描述
例子
正则公式
遮盖结果
CHINA_PHONE_NUM
中国手机号
13123456789
(1\\\\d{2})(\\\\d{4})(\\\\d{4})
139****1234
EMAIL
邮箱
abcd@nio.com
([A-Za-z0-9._%+-]+)(@[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,})
***@nio.com
CHINA_IDCARD
中国身份证
420101199004135043
(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|[7-9]1)\\\\d{4}((18|19|20)\\\\d{2}((0[1-9])|(1[0-2]))((0[1-9]|1\\\\d|2[0-8])|(1[0-2](29|30)))|(1[013-9]|2[0-35-9])31)\\\\d{3}[0-9Xx]
420101****5043
ADDR
中文地址
北京市海淀区北三环西路43号
((.{1,6}?(省|市|自治区|自治州|县|区|镇|乡))){1,3}((.{1,6}(路|街|里|街道|村|屯|组|小区|大厦|号|广场))){1,3}((.{1,6}(号楼|单元|层|室|户|号|房))|(\\\\d+-\\\\d+-\\\\d+)){0,3}
全部遮盖为****
DEBIT_CARD
借记卡
6225092716776464882
(62\\\\d{5,11})(\\\\d{6})
6225092716776****
CREDIT_CARD 
信用卡
4539138994741478
([1-9]\\\\d{3}[\\\\s-]?\\\\d{4}[\\\\s-]?\\\\d{4}[\\\\s-]?)(\\\\d{4})
453913899474***
CHINA_PASSPORT
中国护照
G86067430
((1[45]\\\\d{7})|([P|p|S|s]\\\\d{7})|([S|s|G|g|E|e]\\\\d{8})|([Gg|Tt|Ss|Ll|Qq|Dd|Aa|Ff]\\\\d{8})|([H|h|M|m]\\\\d{8,10}))
全部遮盖为****
MACADDR  
Mac
地址
06-06-06-aa-bb-cc
([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})
06-06-06-aa-****cc
IP   
Ip
地址
120.32.23.137
((?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))
120.32.23.***
DOMAIN
域名
www.abc123.com
((\\\\w|(\\\\w[\\\\w-]{0,86}\\\\w))\\\\.(\\\\w|(\\\\w[\\\\w-]{0,73}\\\\w))\\\\.((\\\\w{2,12}\\\\.\\\\w{2,12})|(\\\\w{2,25})))|((\\\\w|(\\\\w[\\\\w-]{0,162}\\\\w))\\\\.((\\\\w{2,12}\\\\.\\\\w{2,12})|(\\\\w{2,25})))
不提供遮盖功能
LOCATION
经纬度
31.886551,120.443934
[\\\\-\\+]?0(\\.\\d{4,10})|([1-9](\\d)?)(\\.\\d{4,10})|1[0-7]\\d{1}(\\.\\d{4,10})|180\\.0{1,10}
不提供遮盖功能
VIN
车架号
LJ1EEAUU8J7700492
([A-HJ-NPR-Z\\\\d]{10})([A-HJ-NPR-Z\\\\d]{7})
LJ1EEAUU8J****
plate_number
车牌号
京 N5J980
[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]
不提供遮盖功能
NAME
名字
日志字段名为:姓名
字段名:["real_name","family_name","last_name","姓名","名字","用户名", "收件人","recv_person", "receive_person"]
全部遮盖为****
password
密码
日志字段名为:password
字段名:["password", "passwd", "secret", "pass", "密码", "凭证"]
全部遮盖为****
token
token
日志字段名为:token
字段名 :["token", "account_key", "api_key", "授权码"]
全部遮盖为****